// https://d3js.org Version 4.11.0. Copyright 2017 Mike Bostock.
(function(t, n) {
        "object" == typeof exports && "undefined" != typeof module ? n(exports) : "function" == typeof define && define.amd ? define(["exports"], n) : n(t.d3 = t.d3 || {})
    }
)(this, function(t) {
    "use strict";
    function n(t) {
        return function(n, e) {
            return ls(t(n), e)
        }
    }
    function e(t, n) {
        return [t, n]
    }
    function r(t, n, e) {
        var r = (n - t) / Math.max(0, e)
            , i = Math.floor(Math.log(r) / Math.LN10)
            , o = r / Math.pow(10, i);
        return i >= 0 ? (o >= ks ? 10 : o >= Ss ? 5 : o >= Es ? 2 : 1) * Math.pow(10, i) : -Math.pow(10, -i) / (o >= ks ? 10 : o >= Ss ? 5 : o >= Es ? 2 : 1)
    }
    function i(t, n, e) {
        var r = Math.abs(n - t) / Math.max(0, e)
            , i = Math.pow(10, Math.floor(Math.log(r) / Math.LN10))
            , o = r / i;
        return o >= ks ? i *= 10 : o >= Ss ? i *= 5 : o >= Es && (i *= 2),
            n < t ? -i : i
    }
    function o(t) {
        return t.length
    }
    function u(t) {
        return "translate(" + (t + .5) + ",0)"
    }
    function a(t) {
        return "translate(0," + (t + .5) + ")"
    }
    function c(t) {
        return function(n) {
            return +t(n)
        }
    }
    function s(t) {
        var n = Math.max(0, t.bandwidth() - 1) / 2;
        return t.round() && (n = Math.round(n)),
            function(e) {
                return +t(e) + n
            }
    }
    function f() {
        return !this.__axis
    }
    function l(t, n) {
        function e(e) {
            var u = null == i ? n.ticks ? n.ticks.apply(n, r) : n.domain() : i
                , a = null == o ? n.tickFormat ? n.tickFormat.apply(n, r) : Us : o
                , g = Math.max(l, 0) + p
                , y = n.range()
                , m = +y[0] + .5
                , x = +y[y.length - 1] + .5
                , b = (n.bandwidth ? s : c)(n.copy())
                , w = e.selection ? e.selection() : e
                , M = w.selectAll(".domain").data([null])
                , T = w.selectAll(".tick").data(u, n).order()
                , N = T.exit()
                , k = T.enter().append("g").attr("class", "tick")
                , S = T.select("line")
                , E = T.select("text");
            M = M.merge(M.enter().insert("path", ".tick").attr("class", "domain").attr("stroke", "#000")),
                T = T.merge(k),
                S = S.merge(k.append("line").attr("stroke", "#000").attr(v + "2", d * l)),
                E = E.merge(k.append("text").attr("fill", "#000").attr(v, d * g).attr("dy", t === Ds ? "0em" : t === Fs ? "0.71em" : "0.32em")),
            e !== w && (M = M.transition(e),
                T = T.transition(e),
                S = S.transition(e),
                E = E.transition(e),
                N = N.transition(e).attr("opacity", Ys).attr("transform", function(t) {
                    return isFinite(t = b(t)) ? _(t) : this.getAttribute("transform")
                }),
                k.attr("opacity", Ys).attr("transform", function(t) {
                    var n = this.parentNode.__axis;
                    return _(n && isFinite(n = n(t)) ? n : b(t))
                })),
                N.remove(),
                M.attr("d", t === Is || t == Os ? "M" + d * h + "," + m + "H0.5V" + x + "H" + d * h : "M" + m + "," + d * h + "V0.5H" + x + "V" + d * h),
                T.attr("opacity", 1).attr("transform", function(t) {
                    return _(b(t))
                }),
                S.attr(v + "2", d * l),
                E.attr(v, d * g).text(a),
                w.filter(f).attr("fill", "none").attr("font-size", 10).attr("font-family", "sans-serif").attr("text-anchor", t === Os ? "start" : t === Is ? "end" : "middle"),
                w.each(function() {
                    this.__axis = b
                })
        }
        var r = []
            , i = null
            , o = null
            , l = 6
            , h = 6
            , p = 3
            , d = t === Ds || t === Is ? -1 : 1
            , v = t === Is || t === Os ? "x" : "y"
            , _ = t === Ds || t === Fs ? u : a;
        return e.scale = function(t) {
            return arguments.length ? (n = t,
                e) : n
        }
            ,
            e.ticks = function() {
                return r = qs.call(arguments),
                    e
            }
            ,
            e.tickArguments = function(t) {
                return arguments.length ? (r = null == t ? [] : qs.call(t),
                    e) : r.slice()
            }
            ,
            e.tickValues = function(t) {
                return arguments.length ? (i = null == t ? null : qs.call(t),
                    e) : i && i.slice()
            }
            ,
            e.tickFormat = function(t) {
                return arguments.length ? (o = t,
                    e) : o
            }
            ,
            e.tickSize = function(t) {
                return arguments.length ? (l = h = +t,
                    e) : l
            }
            ,
            e.tickSizeInner = function(t) {
                return arguments.length ? (l = +t,
                    e) : l
            }
            ,
            e.tickSizeOuter = function(t) {
                return arguments.length ? (h = +t,
                    e) : h
            }
            ,
            e.tickPadding = function(t) {
                return arguments.length ? (p = +t,
                    e) : p
            }
            ,
            e
    }
    function h() {
        for (var t, n = 0, e = arguments.length, r = {}; n < e; ++n) {
            if (!(t = arguments[n] + "") || t in r)
                throw new Error("illegal type: " + t);
            r[t] = []
        }
        return new p(r)
    }
    function p(t) {
        this._ = t
    }
    function d(t, n) {
        return t.trim().split(/^|\s+/).map(function(t) {
            var e = ""
                , r = t.indexOf(".");
            if (r >= 0 && (e = t.slice(r + 1),
                    t = t.slice(0, r)),
                t && !n.hasOwnProperty(t))
                throw new Error("unknown type: " + t);
            return {
                type: t,
                name: e
            }
        })
    }
    function v(t, n) {
        for (var e, r = 0, i = t.length; r < i; ++r)
            if ((e = t[r]).name === n)
                return e.value
    }
    function _(t, n, e) {
        for (var r = 0, i = t.length; r < i; ++r)
            if (t[r].name === n) {
                t[r] = Bs,
                    t = t.slice(0, r).concat(t.slice(r + 1));
                break
            }
        return null != e && t.push({
            name: n,
            value: e
        }),
            t
    }
    function g(t) {
        return function() {
            var n = this.ownerDocument
                , e = this.namespaceURI;
            return e === js && n.documentElement.namespaceURI === js ? n.createElement(t) : n.createElementNS(e, t)
        }
    }
    function y(t) {
        return function() {
            return this.ownerDocument.createElementNS(t.space, t.local)
        }
    }
    function m() {
        return new x
    }
    function x() {
        this._ = "@" + (++Vs).toString(36)
    }
    function b(t, n, e) {
        return t = w(t, n, e),
            function(n) {
                var e = n.relatedTarget;
                e && (e === this || 8 & e.compareDocumentPosition(this)) || t.call(this, n)
            }
    }
    function w(n, e, r) {
        return function(i) {
            var o = t.event;
            t.event = i;
            try {
                n.call(this, this.__data__, e, r)
            } finally {
                t.event = o
            }
        }
    }
    function M(t) {
        return t.trim().split(/^|\s+/).map(function(t) {
            var n = ""
                , e = t.indexOf(".");
            return e >= 0 && (n = t.slice(e + 1),
                t = t.slice(0, e)),
                {
                    type: t,
                    name: n
                }
        })
    }
    function T(t) {
        return function() {
            var n = this.__on;
            if (n) {
                for (var e, r = 0, i = -1, o = n.length; r < o; ++r)
                    e = n[r],
                        t.type && e.type !== t.type || e.name !== t.name ? n[++i] = e : this.removeEventListener(e.type, e.listener, e.capture);
                ++i ? n.length = i : delete this.__on
            }
        }
    }
    function N(t, n, e) {
        var r = Qs.hasOwnProperty(t.type) ? b : w;
        return function(i, o, u) {
            var a, c = this.__on, s = r(n, o, u);
            if (c)
                for (var f = 0, l = c.length; f < l; ++f)
                    if ((a = c[f]).type === t.type && a.name === t.name)
                        return this.removeEventListener(a.type, a.listener, a.capture),
                            this.addEventListener(a.type, a.listener = s, a.capture = e),
                            void (a.value = n);
            this.addEventListener(t.type, s, e),
                a = {
                    type: t.type,
                    name: t.name,
                    value: n,
                    listener: s,
                    capture: e
                },
                c ? c.push(a) : this.__on = [a]
        }
    }
    function k(n, e, r, i) {
        var o = t.event;
        n.sourceEvent = t.event,
            t.event = n;
        try {
            return e.apply(r, i)
        } finally {
            t.event = o
        }
    }
    function S() {}
    function E() {
        return []
    }
    function A(t, n) {
        this.ownerDocument = t.ownerDocument,
            this.namespaceURI = t.namespaceURI,
            this._next = null,
            this._parent = t,
            this.__data__ = n
    }
    function C(t, n, e, r, i, o) {
        for (var u, a = 0, c = n.length, s = o.length; a < s; ++a)
            (u = n[a]) ? (u.__data__ = o[a],
                r[a] = u) : e[a] = new A(t,o[a]);
        for (; a < c; ++a)
            (u = n[a]) && (i[a] = u)
    }
    function z(t, n, e, r, i, o, u) {
        var a, c, s, f = {}, l = n.length, h = o.length, p = new Array(l);
        for (a = 0; a < l; ++a)
            (c = n[a]) && (p[a] = s = af + u.call(c, c.__data__, a, n),
                s in f ? i[a] = c : f[s] = c);
        for (a = 0; a < h; ++a)
            (c = f[s = af + u.call(t, o[a], a, o)]) ? (r[a] = c,
                c.__data__ = o[a],
                f[s] = null) : e[a] = new A(t,o[a]);
        for (a = 0; a < l; ++a)
            (c = n[a]) && f[p[a]] === c && (i[a] = c)
    }
    function P(t, n) {
        return t < n ? -1 : t > n ? 1 : t >= n ? 0 : NaN
    }
    function R(t) {
        return function() {
            this.removeAttribute(t)
        }
    }
    function L(t) {
        return function() {
            this.removeAttributeNS(t.space, t.local)
        }
    }
    function q(t, n) {
        return function() {
            this.setAttribute(t, n)
        }
    }
    function U(t, n) {
        return function() {
            this.setAttributeNS(t.space, t.local, n)
        }
    }
    function D(t, n) {
        return function() {
            var e = n.apply(this, arguments);
            null == e ? this.removeAttribute(t) : this.setAttribute(t, e)
        }
    }
    function O(t, n) {
        return function() {
            var e = n.apply(this, arguments);
            null == e ? this.removeAttributeNS(t.space, t.local) : this.setAttributeNS(t.space, t.local, e)
        }
    }
    function F(t) {
        return function() {
            this.style.removeProperty(t)
        }
    }
    function I(t, n, e) {
        return function() {
            this.style.setProperty(t, n, e)
        }
    }
    function Y(t, n, e) {
        return function() {
            var r = n.apply(this, arguments);
            null == r ? this.style.removeProperty(t) : this.style.setProperty(t, r, e)
        }
    }
    function B(t, n) {
        return t.style.getPropertyValue(n) || cf(t).getComputedStyle(t, null).getPropertyValue(n)
    }
    function j(t) {
        return function() {
            delete this[t]
        }
    }
    function H(t, n) {
        return function() {
            this[t] = n
        }
    }
    function X(t, n) {
        return function() {
            var e = n.apply(this, arguments);
            null == e ? delete this[t] : this[t] = e
        }
    }
    function $(t) {
        return t.trim().split(/^|\s+/)
    }
    function V(t) {
        return t.classList || new W(t)
    }
    function W(t) {
        this._node = t,
            this._names = $(t.getAttribute("class") || "")
    }
    function Z(t, n) {
        for (var e = V(t), r = -1, i = n.length; ++r < i; )
            e.add(n[r])
    }
    function G(t, n) {
        for (var e = V(t), r = -1, i = n.length; ++r < i; )
            e.remove(n[r])
    }
    function J(t) {
        return function() {
            Z(this, t)
        }
    }
    function Q(t) {
        return function() {
            G(this, t)
        }
    }
    function K(t, n) {
        return function() {
            (n.apply(this, arguments) ? Z : G)(this, t)
        }
    }
    function tt() {
        this.textContent = ""
    }
    function nt(t) {
        return function() {
            this.textContent = t
        }
    }
    function et(t) {
        return function() {
            var n = t.apply(this, arguments);
            this.textContent = null == n ? "" : n
        }
    }
    function rt() {
        this.innerHTML = ""
    }
    function it(t) {
        return function() {
            this.innerHTML = t
        }
    }
    function ot(t) {
        return function() {
            var n = t.apply(this, arguments);
            this.innerHTML = null == n ? "" : n
        }
    }
    function ut() {
        this.nextSibling && this.parentNode.appendChild(this)
    }
    function at() {
        this.previousSibling && this.parentNode.insertBefore(this, this.parentNode.firstChild)
    }
    function ct() {
        return null
    }
    function st() {
        var t = this.parentNode;
        t && t.removeChild(this)
    }
    function ft(t, n, e) {
        var r = cf(t)
            , i = r.CustomEvent;
        "function" == typeof i ? i = new i(n,e) : (i = r.document.createEvent("Event"),
            e ? (i.initEvent(n, e.bubbles, e.cancelable),
                i.detail = e.detail) : i.initEvent(n, !1, !1)),
            t.dispatchEvent(i)
    }
    function lt(t, n) {
        return function() {
            return ft(this, t, n)
        }
    }
    function ht(t, n) {
        return function() {
            return ft(this, t, n.apply(this, arguments))
        }
    }
    function pt(t, n) {
        this._groups = t,
            this._parents = n
    }
    function dt() {
        return new pt([[document.documentElement]],sf)
    }
    function vt() {
        t.event.stopImmediatePropagation()
    }
    function _t(t, n) {
        var e = t.document.documentElement
            , r = ff(t).on("dragstart.drag", null);
        n && (r.on("click.drag", hf, !0),
            setTimeout(function() {
                r.on("click.drag", null)
            }, 0)),
            "onselectstart"in e ? r.on("selectstart.drag", null) : (e.style.MozUserSelect = e.__noselect,
                delete e.__noselect)
    }
    function gt(t, n, e, r, i, o, u, a, c, s) {
        this.target = t,
            this.type = n,
            this.subject = e,
            this.identifier = r,
            this.active = i,
            this.x = o,
            this.y = u,
            this.dx = a,
            this.dy = c,
            this._ = s
    }
    function yt() {
        return !t.event.button
    }
    function mt() {
        return this.parentNode
    }
    function xt(n) {
        return null == n ? {
            x: t.event.x,
            y: t.event.y
        } : n
    }
    function bt() {
        return "ontouchstart"in this
    }
    function wt(t, n) {
        var e = Object.create(t.prototype);
        for (var r in n)
            e[r] = n[r];
        return e
    }
    function Mt() {}
    function Tt(t) {
        var n;
        return t = (t + "").trim().toLowerCase(),
            (n = mf.exec(t)) ? (n = parseInt(n[1], 16),
                new At(n >> 8 & 15 | n >> 4 & 240,n >> 4 & 15 | 240 & n,(15 & n) << 4 | 15 & n,1)) : (n = xf.exec(t)) ? Nt(parseInt(n[1], 16)) : (n = bf.exec(t)) ? new At(n[1],n[2],n[3],1) : (n = wf.exec(t)) ? new At(255 * n[1] / 100,255 * n[2] / 100,255 * n[3] / 100,1) : (n = Mf.exec(t)) ? kt(n[1], n[2], n[3], n[4]) : (n = Tf.exec(t)) ? kt(255 * n[1] / 100, 255 * n[2] / 100, 255 * n[3] / 100, n[4]) : (n = Nf.exec(t)) ? Ct(n[1], n[2] / 100, n[3] / 100, 1) : (n = kf.exec(t)) ? Ct(n[1], n[2] / 100, n[3] / 100, n[4]) : Sf.hasOwnProperty(t) ? Nt(Sf[t]) : "transparent" === t ? new At(NaN,NaN,NaN,0) : null
    }
    function Nt(t) {
        return new At(t >> 16 & 255,t >> 8 & 255,255 & t,1)
    }
    function kt(t, n, e, r) {
        return r <= 0 && (t = n = e = NaN),
            new At(t,n,e,r)
    }
    function St(t) {
        return t instanceof Mt || (t = Tt(t)),
            t ? (t = t.rgb(),
                new At(t.r,t.g,t.b,t.opacity)) : new At
    }
    function Et(t, n, e, r) {
        return 1 === arguments.length ? St(t) : new At(t,n,e,null == r ? 1 : r)
    }
    function At(t, n, e, r) {
        this.r = +t,
            this.g = +n,
            this.b = +e,
            this.opacity = +r
    }
    function Ct(t, n, e, r) {
        return r <= 0 ? t = n = e = NaN : e <= 0 || e >= 1 ? t = n = NaN : n <= 0 && (t = NaN),
            new Rt(t,n,e,r)
    }
    function zt(t) {
        if (t instanceof Rt)
            return new Rt(t.h,t.s,t.l,t.opacity);
        if (t instanceof Mt || (t = Tt(t)),
                !t)
            return new Rt;
        if (t instanceof Rt)
            return t;
        var n = (t = t.rgb()).r / 255
            , e = t.g / 255
            , r = t.b / 255
            , i = Math.min(n, e, r)
            , o = Math.max(n, e, r)
            , u = NaN
            , a = o - i
            , c = (o + i) / 2;
        return a ? (u = n === o ? (e - r) / a + 6 * (e < r) : e === o ? (r - n) / a + 2 : (n - e) / a + 4,
            a /= c < .5 ? o + i : 2 - o - i,
            u *= 60) : a = c > 0 && c < 1 ? 0 : u,
            new Rt(u,a,c,t.opacity)
    }
    function Pt(t, n, e, r) {
        return 1 === arguments.length ? zt(t) : new Rt(t,n,e,null == r ? 1 : r)
    }
    function Rt(t, n, e, r) {
        this.h = +t,
            this.s = +n,
            this.l = +e,
            this.opacity = +r
    }
    function Lt(t, n, e) {
        return 255 * (t < 60 ? n + (e - n) * t / 60 : t < 180 ? e : t < 240 ? n + (e - n) * (240 - t) / 60 : n)
    }
    function qt(t) {
        if (t instanceof Dt)
            return new Dt(t.l,t.a,t.b,t.opacity);
        if (t instanceof Ht) {
            var n = t.h * Ef;
            return new Dt(t.l,Math.cos(n) * t.c,Math.sin(n) * t.c,t.opacity)
        }
        t instanceof At || (t = St(t));
        var e = Yt(t.r)
            , r = Yt(t.g)
            , i = Yt(t.b)
            , o = Ot((.4124564 * e + .3575761 * r + .1804375 * i) / Cf)
            , u = Ot((.2126729 * e + .7151522 * r + .072175 * i) / zf);
        return new Dt(116 * u - 16,500 * (o - u),200 * (u - Ot((.0193339 * e + .119192 * r + .9503041 * i) / Pf)),t.opacity)
    }
    function Ut(t, n, e, r) {
        return 1 === arguments.length ? qt(t) : new Dt(t,n,e,null == r ? 1 : r)
    }
    function Dt(t, n, e, r) {
        this.l = +t,
            this.a = +n,
            this.b = +e,
            this.opacity = +r
    }
    function Ot(t) {
        return t > Uf ? Math.pow(t, 1 / 3) : t / qf + Rf
    }
    function Ft(t) {
        return t > Lf ? t * t * t : qf * (t - Rf)
    }
    function It(t) {
        return 255 * (t <= .0031308 ? 12.92 * t : 1.055 * Math.pow(t, 1 / 2.4) - .055)
    }
    function Yt(t) {
        return (t /= 255) <= .04045 ? t / 12.92 : Math.pow((t + .055) / 1.055, 2.4)
    }
    function Bt(t) {
        if (t instanceof Ht)
            return new Ht(t.h,t.c,t.l,t.opacity);
        t instanceof Dt || (t = qt(t));
        var n = Math.atan2(t.b, t.a) * Af;
        return new Ht(n < 0 ? n + 360 : n,Math.sqrt(t.a * t.a + t.b * t.b),t.l,t.opacity)
    }
    function jt(t, n, e, r) {
        return 1 === arguments.length ? Bt(t) : new Ht(t,n,e,null == r ? 1 : r)
    }
    function Ht(t, n, e, r) {
        this.h = +t,
            this.c = +n,
            this.l = +e,
            this.opacity = +r
    }
    function Xt(t) {
        if (t instanceof Vt)
            return new Vt(t.h,t.s,t.l,t.opacity);
        t instanceof At || (t = St(t));
        var n = t.r / 255
            , e = t.g / 255
            , r = t.b / 255
            , i = (Hf * r + Bf * n - jf * e) / (Hf + Bf - jf)
            , o = r - i
            , u = (Yf * (e - i) - Ff * o) / If
            , a = Math.sqrt(u * u + o * o) / (Yf * i * (1 - i))
            , c = a ? Math.atan2(u, o) * Af - 120 : NaN;
        return new Vt(c < 0 ? c + 360 : c,a,i,t.opacity)
    }
    function $t(t, n, e, r) {
        return 1 === arguments.length ? Xt(t) : new Vt(t,n,e,null == r ? 1 : r)
    }
    function Vt(t, n, e, r) {
        this.h = +t,
            this.s = +n,
            this.l = +e,
            this.opacity = +r
    }
    function Wt(t, n, e, r, i) {
        var o = t * t
            , u = o * t;
        return ((1 - 3 * t + 3 * o - u) * n + (4 - 6 * o + 3 * u) * e + (1 + 3 * t + 3 * o - 3 * u) * r + u * i) / 6
    }
    function Zt(t, n) {
        return function(e) {
            return t + e * n
        }
    }
    function Gt(t, n, e) {
        return t = Math.pow(t, e),
            n = Math.pow(n, e) - t,
            e = 1 / e,
            function(r) {
                return Math.pow(t + r * n, e)
            }
    }
    function Jt(t, n) {
        var e = n - t;
        return e ? Zt(t, e > 180 || e < -180 ? e - 360 * Math.round(e / 360) : e) : Kf(isNaN(t) ? n : t)
    }
    function Qt(t) {
        return 1 == (t = +t) ? Kt : function(n, e) {
            return e - n ? Gt(n, e, t) : Kf(isNaN(n) ? e : n)
        }
    }
    function Kt(t, n) {
        var e = n - t;
        return e ? Zt(t, e) : Kf(isNaN(t) ? n : t)
    }
    function tn(t) {
        return function(n) {
            var e, r, i = n.length, o = new Array(i), u = new Array(i), a = new Array(i);
            for (e = 0; e < i; ++e)
                r = Et(n[e]),
                    o[e] = r.r || 0,
                    u[e] = r.g || 0,
                    a[e] = r.b || 0;
            return o = t(o),
                u = t(u),
                a = t(a),
                r.opacity = 1,
                function(t) {
                    return r.r = o(t),
                        r.g = u(t),
                        r.b = a(t),
                    r + ""
                }
        }
    }
    function nn(t) {
        return function() {
            return t
        }
    }
    function en(t) {
        return function(n) {
            return t(n) + ""
        }
    }
    function rn(t, n, e, r) {
        function i(t) {
            return t.length ? t.pop() + " " : ""
        }
        function o(t, r, i, o, u, a) {
            if (t !== i || r !== o) {
                var c = u.push("translate(", null, n, null, e);
                a.push({
                    i: c - 4,
                    x: ol(t, i)
                }, {
                    i: c - 2,
                    x: ol(r, o)
                })
            } else
                (i || o) && u.push("translate(" + i + n + o + e)
        }
        function u(t, n, e, o) {
            t !== n ? (t - n > 180 ? n += 360 : n - t > 180 && (t += 360),
                o.push({
                    i: e.push(i(e) + "rotate(", null, r) - 2,
                    x: ol(t, n)
                })) : n && e.push(i(e) + "rotate(" + n + r)
        }
        function a(t, n, e, o) {
            t !== n ? o.push({
                i: e.push(i(e) + "skewX(", null, r) - 2,
                x: ol(t, n)
            }) : n && e.push(i(e) + "skewX(" + n + r)
        }
        function c(t, n, e, r, o, u) {
            if (t !== e || n !== r) {
                var a = o.push(i(o) + "scale(", null, ",", null, ")");
                u.push({
                    i: a - 4,
                    x: ol(t, e)
                }, {
                    i: a - 2,
                    x: ol(n, r)
                })
            } else
                1 === e && 1 === r || o.push(i(o) + "scale(" + e + "," + r + ")")
        }
        return function(n, e) {
            var r = []
                , i = [];
            return n = t(n),
                e = t(e),
                o(n.translateX, n.translateY, e.translateX, e.translateY, r, i),
                u(n.rotate, e.rotate, r, i),
                a(n.skewX, e.skewX, r, i),
                c(n.scaleX, n.scaleY, e.scaleX, e.scaleY, r, i),
                n = e = null,
                function(t) {
                    for (var n, e = -1, o = i.length; ++e < o; )
                        r[(n = i[e]).i] = n.x(t);
                    return r.join("")
                }
        }
    }
    function on(t) {
        return ((t = Math.exp(t)) + 1 / t) / 2
    }
    function un(t) {
        return ((t = Math.exp(t)) - 1 / t) / 2
    }
    function an(t) {
        return ((t = Math.exp(2 * t)) - 1) / (t + 1)
    }
    function cn(t) {
        return function(n, e) {
            var r = t((n = Pt(n)).h, (e = Pt(e)).h)
                , i = Kt(n.s, e.s)
                , o = Kt(n.l, e.l)
                , u = Kt(n.opacity, e.opacity);
            return function(t) {
                return n.h = r(t),
                    n.s = i(t),
                    n.l = o(t),
                    n.opacity = u(t),
                n + ""
            }
        }
    }
    function sn(t) {
        return function(n, e) {
            var r = t((n = jt(n)).h, (e = jt(e)).h)
                , i = Kt(n.c, e.c)
                , o = Kt(n.l, e.l)
                , u = Kt(n.opacity, e.opacity);
            return function(t) {
                return n.h = r(t),
                    n.c = i(t),
                    n.l = o(t),
                    n.opacity = u(t),
                n + ""
            }
        }
    }
    function fn(t) {
        return function n(e) {
            function r(n, r) {
                var i = t((n = $t(n)).h, (r = $t(r)).h)
                    , o = Kt(n.s, r.s)
                    , u = Kt(n.l, r.l)
                    , a = Kt(n.opacity, r.opacity);
                return function(t) {
                    return n.h = i(t),
                        n.s = o(t),
                        n.l = u(Math.pow(t, e)),
                        n.opacity = a(t),
                    n + ""
                }
            }
            return e = +e,
                r.gamma = n,
                r
        }(1)
    }
    function ln() {
        return Cl || (Rl(hn),
            Cl = Pl.now() + zl)
    }
    function hn() {
        Cl = 0
    }
    function pn() {
        this._call = this._time = this._next = null
    }
    function dn(t, n, e) {
        var r = new pn;
        return r.restart(t, n, e),
            r
    }
    function vn() {
        ln(),
            ++Nl;
        for (var t, n = Zf; n; )
            (t = Cl - n._time) >= 0 && n._call.call(null, t),
                n = n._next;
        --Nl
    }
    function _n() {
        Cl = (Al = Pl.now()) + zl,
            Nl = kl = 0;
        try {
            vn()
        } finally {
            Nl = 0,
                yn(),
                Cl = 0
        }
    }
    function gn() {
        var t = Pl.now()
            , n = t - Al;
        n > El && (zl -= n,
            Al = t)
    }
    function yn() {
        for (var t, n, e = Zf, r = 1 / 0; e; )
            e._call ? (r > e._time && (r = e._time),
                t = e,
                e = e._next) : (n = e._next,
                e._next = null,
                e = t ? t._next = n : Zf = n);
        Gf = t,
            mn(r)
    }
    function mn(t) {
        Nl || (kl && (kl = clearTimeout(kl)),
            t - Cl > 24 ? (t < 1 / 0 && (kl = setTimeout(_n, t - Pl.now() - zl)),
            Sl && (Sl = clearInterval(Sl))) : (Sl || (Al = Pl.now(),
                Sl = setInterval(gn, El)),
                Nl = 1,
                Rl(_n)))
    }
    function xn(t, n) {
        var e = t.__transition;
        if (!e || !(e = e[n]) || e.state > Dl)
            throw new Error("too late");
        return e
    }
    function bn(t, n) {
        var e = t.__transition;
        if (!e || !(e = e[n]) || e.state > Fl)
            throw new Error("too late");
        return e
    }
    function wn(t, n) {
        var e = t.__transition;
        if (!e || !(e = e[n]))
            throw new Error("too late");
        return e
    }
    function Mn(t, n, e) {
        function r(c) {
            var s, f, l, h;
            if (e.state !== Ol)
                return o();
            for (s in a)
                if ((h = a[s]).name === e.name) {
                    if (h.state === Il)
                        return Ll(r);
                    h.state === Yl ? (h.state = jl,
                        h.timer.stop(),
                        h.on.call("interrupt", t, t.__data__, h.index, h.group),
                        delete a[s]) : +s < n && (h.state = jl,
                        h.timer.stop(),
                        delete a[s])
                }
            if (Ll(function() {
                    e.state === Il && (e.state = Yl,
                        e.timer.restart(i, e.delay, e.time),
                        i(c))
                }),
                    e.state = Fl,
                    e.on.call("start", t, t.__data__, e.index, e.group),
                e.state === Fl) {
                for (e.state = Il,
                         u = new Array(l = e.tween.length),
                         s = 0,
                         f = -1; s < l; ++s)
                    (h = e.tween[s].value.call(t, t.__data__, e.index, e.group)) && (u[++f] = h);
                u.length = f + 1
            }
        }
        function i(n) {
            for (var r = n < e.duration ? e.ease.call(null, n / e.duration) : (e.timer.restart(o),
                e.state = Bl,
                1), i = -1, a = u.length; ++i < a; )
                u[i].call(null, r);
            e.state === Bl && (e.on.call("end", t, t.__data__, e.index, e.group),
                o())
        }
        function o() {
            e.state = jl,
                e.timer.stop(),
                delete a[n];
            for (var r in a)
                return;
            delete t.__transition
        }
        var u, a = t.__transition;
        a[n] = e,
            e.timer = dn(function(t) {
                e.state = Ol,
                    e.timer.restart(r, e.delay, e.time),
                e.delay <= t && r(t - e.delay)
            }, 0, e.time)
    }
    function Tn(t, n) {
        var e, r;
        return function() {
            var i = bn(this, t)
                , o = i.tween;
            if (o !== e)
                for (var u = 0, a = (r = e = o).length; u < a; ++u)
                    if (r[u].name === n) {
                        (r = r.slice()).splice(u, 1);
                        break
                    }
            i.tween = r
        }
    }
    function Nn(t, n, e) {
        var r, i;
        if ("function" != typeof e)
            throw new Error;
        return function() {
            var o = bn(this, t)
                , u = o.tween;
            if (u !== r) {
                i = (r = u).slice();
                for (var a = {
                    name: n,
                    value: e
                }, c = 0, s = i.length; c < s; ++c)
                    if (i[c].name === n) {
                        i[c] = a;
                        break
                    }
                c === s && i.push(a)
            }
            o.tween = i
        }
    }
    function kn(t, n, e) {
        var r = t._id;
        return t.each(function() {
            var t = bn(this, r);
            (t.value || (t.value = {}))[n] = e.apply(this, arguments)
        }),
            function(t) {
                return wn(t, r).value[n]
            }
    }
    function Sn(t) {
        return function() {
            this.removeAttribute(t)
        }
    }
    function En(t) {
        return function() {
            this.removeAttributeNS(t.space, t.local)
        }
    }
    function An(t, n, e) {
        var r, i;
        return function() {
            var o = this.getAttribute(t);
            return o === e ? null : o === r ? i : i = n(r = o, e)
        }
    }
    function Cn(t, n, e) {
        var r, i;
        return function() {
            var o = this.getAttributeNS(t.space, t.local);
            return o === e ? null : o === r ? i : i = n(r = o, e)
        }
    }
    function zn(t, n, e) {
        var r, i, o;
        return function() {
            var u, a = e(this);
            {
                if (null != a)
                    return (u = this.getAttribute(t)) === a ? null : u === r && a === i ? o : o = n(r = u, i = a);
                this.removeAttribute(t)
            }
        }
    }
    function Pn(t, n, e) {
        var r, i, o;
        return function() {
            var u, a = e(this);
            {
                if (null != a)
                    return (u = this.getAttributeNS(t.space, t.local)) === a ? null : u === r && a === i ? o : o = n(r = u, i = a);
                this.removeAttributeNS(t.space, t.local)
            }
        }
    }
    function Rn(t, n) {
        function e() {
            var e = this
                , r = n.apply(e, arguments);
            return r && function(n) {
                e.setAttributeNS(t.space, t.local, r(n))
            }
        }
        return e._value = n,
            e
    }
    function Ln(t, n) {
        function e() {
            var e = this
                , r = n.apply(e, arguments);
            return r && function(n) {
                e.setAttribute(t, r(n))
            }
        }
        return e._value = n,
            e
    }
    function qn(t, n) {
        return function() {
            xn(this, t).delay = +n.apply(this, arguments)
        }
    }
    function Un(t, n) {
        return n = +n,
            function() {
                xn(this, t).delay = n
            }
    }
    function Dn(t, n) {
        return function() {
            bn(this, t).duration = +n.apply(this, arguments)
        }
    }
    function On(t, n) {
        return n = +n,
            function() {
                bn(this, t).duration = n
            }
    }
    function Fn(t, n) {
        if ("function" != typeof n)
            throw new Error;
        return function() {
            bn(this, t).ease = n
        }
    }
    function In(t) {
        return (t + "").trim().split(/^|\s+/).every(function(t) {
            var n = t.indexOf(".");
            return n >= 0 && (t = t.slice(0, n)),
            !t || "start" === t
        })
    }
    function Yn(t, n, e) {
        var r, i, o = In(n) ? xn : bn;
        return function() {
            var u = o(this, t)
                , a = u.on;
            a !== r && (i = (r = a).copy()).on(n, e),
                u.on = i
        }
    }
    function Bn(t) {
        return function() {
            var n = this.parentNode;
            for (var e in this.__transition)
                if (+e !== t)
                    return;
            n && n.removeChild(this)
        }
    }
    function jn(t, n) {
        var e, r, i;
        return function() {
            var o = B(this, t)
                , u = (this.style.removeProperty(t),
                B(this, t));
            return o === u ? null : o === e && u === r ? i : i = n(e = o, r = u)
        }
    }
    function Hn(t) {
        return function() {
            this.style.removeProperty(t)
        }
    }
    function Xn(t, n, e) {
        var r, i;
        return function() {
            var o = B(this, t);
            return o === e ? null : o === r ? i : i = n(r = o, e)
        }
    }
    function $n(t, n, e) {
        var r, i, o;
        return function() {
            var u = B(this, t)
                , a = e(this);
            return null == a && (this.style.removeProperty(t),
                a = B(this, t)),
                u === a ? null : u === r && a === i ? o : o = n(r = u, i = a)
        }
    }
    function Vn(t, n, e) {
        function r() {
            var r = this
                , i = n.apply(r, arguments);
            return i && function(n) {
                r.style.setProperty(t, i(n), e)
            }
        }
        return r._value = n,
            r
    }
    function Wn(t) {
        return function() {
            this.textContent = t
        }
    }
    function Zn(t) {
        return function() {
            var n = t(this);
            this.textContent = null == n ? "" : n
        }
    }
    function Gn(t, n, e, r) {
        this._groups = t,
            this._parents = n,
            this._name = e,
            this._id = r
    }
    function Jn(t) {
        return dt().transition(t)
    }
    function Qn() {
        return ++Wl
    }
    function Kn(t) {
        return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2
    }
    function te(t) {
        return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2
    }
    function ne(t) {
        return (1 - Math.cos(Kl * t)) / 2
    }
    function ee(t) {
        return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2
    }
    function re(t) {
        return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2
    }
    function ie(t) {
        return (t = +t) < nh ? fh * t * t : t < rh ? fh * (t -= eh) * t + ih : t < uh ? fh * (t -= oh) * t + ah : fh * (t -= ch) * t + sh
    }
    function oe(t, n) {
        for (var e; !(e = t.__transition) || !(e = e[n]); )
            if (!(t = t.parentNode))
                return yh.time = ln(),
                    yh;
        return e
    }
    function ue() {
        t.event.stopImmediatePropagation()
    }
    function ae(t) {
        return {
            type: t
        }
    }
    function ce() {
        return !t.event.button
    }
    function se() {
        var t = this.ownerSVGElement || this;
        return [[0, 0], [t.width.baseVal.value, t.height.baseVal.value]]
    }
    function fe(t) {
        for (; !t.__brush; )
            if (!(t = t.parentNode))
                return;
        return t.__brush
    }
    function le(t) {
        return t[0][0] === t[1][0] || t[0][1] === t[1][1]
    }
    function he(n) {
        function e(t) {
            var e = t.property("__brush", a).selectAll(".overlay").data([ae("overlay")]);
            e.enter().append("rect").attr("class", "overlay").attr("pointer-events", "all").attr("cursor", Ch.overlay).merge(e).each(function() {
                var t = fe(this).extent;
                ff(this).attr("x", t[0][0]).attr("y", t[0][1]).attr("width", t[1][0] - t[0][0]).attr("height", t[1][1] - t[0][1])
            }),
                t.selectAll(".selection").data([ae("selection")]).enter().append("rect").attr("class", "selection").attr("cursor", Ch.selection).attr("fill", "#777").attr("fill-opacity", .3).attr("stroke", "#fff").attr("shape-rendering", "crispEdges");
            var i = t.selectAll(".handle").data(n.handles, function(t) {
                return t.type
            });
            i.exit().remove(),
                i.enter().append("rect").attr("class", function(t) {
                    return "handle handle--" + t.type
                }).attr("cursor", function(t) {
                    return Ch[t.type]
                }),
                t.each(r).attr("fill", "none").attr("pointer-events", "all").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)").on("mousedown.brush touchstart.brush", u)
        }
        function r() {
            var t = ff(this)
                , n = fe(this).selection;
            n ? (t.selectAll(".selection").style("display", null).attr("x", n[0][0]).attr("y", n[0][1]).attr("width", n[1][0] - n[0][0]).attr("height", n[1][1] - n[0][1]),
                t.selectAll(".handle").style("display", null).attr("x", function(t) {
                    return "e" === t.type[t.type.length - 1] ? n[1][0] - p / 2 : n[0][0] - p / 2
                }).attr("y", function(t) {
                    return "s" === t.type[0] ? n[1][1] - p / 2 : n[0][1] - p / 2
                }).attr("width", function(t) {
                    return "n" === t.type || "s" === t.type ? n[1][0] - n[0][0] + p : p
                }).attr("height", function(t) {
                    return "e" === t.type || "w" === t.type ? n[1][1] - n[0][1] + p : p
                })) : t.selectAll(".selection,.handle").style("display", "none").attr("x", null).attr("y", null).attr("width", null).attr("height", null)
        }
        function i(t, n) {
            return t.__brush.emitter || new o(t,n)
        }
        function o(t, n) {
            this.that = t,
                this.args = n,
                this.state = t.__brush,
                this.active = 0
        }
        function u() {
            function e() {
                var t = nf(w);
                !L || x || b || (Math.abs(t[0] - U[0]) > Math.abs(t[1] - U[1]) ? b = !0 : x = !0),
                    U = t,
                    m = !0,
                    wh(),
                    o()
            }
            function o() {
                var t;
                switch (g = U[0] - q[0],
                    y = U[1] - q[1],
                    T) {
                    case Th:
                    case Mh:
                        N && (g = Math.max(C - a, Math.min(P - p, g)),
                            s = a + g,
                            d = p + g),
                        k && (y = Math.max(z - l, Math.min(R - v, y)),
                            h = l + y,
                            _ = v + y);
                        break;
                    case Nh:
                        N < 0 ? (g = Math.max(C - a, Math.min(P - a, g)),
                            s = a + g,
                            d = p) : N > 0 && (g = Math.max(C - p, Math.min(P - p, g)),
                            s = a,
                            d = p + g),
                            k < 0 ? (y = Math.max(z - l, Math.min(R - l, y)),
                                h = l + y,
                                _ = v) : k > 0 && (y = Math.max(z - v, Math.min(R - v, y)),
                                h = l,
                                _ = v + y);
                        break;
                    case kh:
                        N && (s = Math.max(C, Math.min(P, a - g * N)),
                            d = Math.max(C, Math.min(P, p + g * N))),
                        k && (h = Math.max(z, Math.min(R, l - y * k)),
                            _ = Math.max(z, Math.min(R, v + y * k)))
                }
                d < s && (N *= -1,
                    t = a,
                    a = p,
                    p = t,
                    t = s,
                    s = d,
                    d = t,
                M in zh && F.attr("cursor", Ch[M = zh[M]])),
                _ < h && (k *= -1,
                    t = l,
                    l = v,
                    v = t,
                    t = h,
                    h = _,
                    _ = t,
                M in Ph && F.attr("cursor", Ch[M = Ph[M]])),
                S.selection && (A = S.selection),
                x && (s = A[0][0],
                    d = A[1][0]),
                b && (h = A[0][1],
                    _ = A[1][1]),
                A[0][0] === s && A[0][1] === h && A[1][0] === d && A[1][1] === _ || (S.selection = [[s, h], [d, _]],
                    r.call(w),
                    D.brush())
            }
            function u() {
                if (ue(),
                        t.event.touches) {
                    if (t.event.touches.length)
                        return;
                    c && clearTimeout(c),
                        c = setTimeout(function() {
                            c = null
                        }, 500),
                        O.on("touchmove.brush touchend.brush touchcancel.brush", null)
                } else
                    _t(t.event.view, m),
                        I.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null);
                O.attr("pointer-events", "all"),
                    F.attr("cursor", Ch.overlay),
                S.selection && (A = S.selection),
                le(A) && (S.selection = null,
                    r.call(w)),
                    D.end()
            }
            if (t.event.touches) {
                if (t.event.changedTouches.length < t.event.touches.length)
                    return wh()
            } else if (c)
                return;
            if (f.apply(this, arguments)) {
                var a, s, l, h, p, d, v, _, g, y, m, x, b, w = this, M = t.event.target.__data__.type, T = "selection" === (t.event.metaKey ? M = "overlay" : M) ? Mh : t.event.altKey ? kh : Nh, N = n === Eh ? null : Rh[M], k = n === Sh ? null : Lh[M], S = fe(w), E = S.extent, A = S.selection, C = E[0][0], z = E[0][1], P = E[1][0], R = E[1][1], L = N && k && t.event.shiftKey, q = nf(w), U = q, D = i(w, arguments).beforestart();
                "overlay" === M ? S.selection = A = [[a = n === Eh ? C : q[0], l = n === Sh ? z : q[1]], [p = n === Eh ? P : a, v = n === Sh ? R : l]] : (a = A[0][0],
                    l = A[0][1],
                    p = A[1][0],
                    v = A[1][1]),
                    s = a,
                    h = l,
                    d = p,
                    _ = v;
                var O = ff(w).attr("pointer-events", "none")
                    , F = O.selectAll(".overlay").attr("cursor", Ch[M]);
                if (t.event.touches)
                    O.on("touchmove.brush", e, !0).on("touchend.brush touchcancel.brush", u, !0);
                else {
                    var I = ff(t.event.view).on("keydown.brush", function() {
                        switch (t.event.keyCode) {
                            case 16:
                                L = N && k;
                                break;
                            case 18:
                                T === Nh && (N && (p = d - g * N,
                                    a = s + g * N),
                                k && (v = _ - y * k,
                                    l = h + y * k),
                                    T = kh,
                                    o());
                                break;
                            case 32:
                                T !== Nh && T !== kh || (N < 0 ? p = d - g : N > 0 && (a = s - g),
                                    k < 0 ? v = _ - y : k > 0 && (l = h - y),
                                    T = Th,
                                    F.attr("cursor", Ch.selection),
                                    o());
                                break;
                            default:
                                return
                        }
                        wh()
                    }, !0).on("keyup.brush", function() {
                        switch (t.event.keyCode) {
                            case 16:
                                L && (x = b = L = !1,
                                    o());
                                break;
                            case 18:
                                T === kh && (N < 0 ? p = d : N > 0 && (a = s),
                                    k < 0 ? v = _ : k > 0 && (l = h),
                                    T = Nh,
                                    o());
                                break;
                            case 32:
                                T === Th && (t.event.altKey ? (N && (p = d - g * N,
                                    a = s + g * N),
                                k && (v = _ - y * k,
                                    l = h + y * k),
                                    T = kh) : (N < 0 ? p = d : N > 0 && (a = s),
                                    k < 0 ? v = _ : k > 0 && (l = h),
                                    T = Nh),
                                    F.attr("cursor", Ch[M]),
                                    o());
                                break;
                            default:
                                return
                        }
                        wh()
                    }, !0).on("mousemove.brush", e, !0).on("mouseup.brush", u, !0);
                    pf(t.event.view)
                }
                ue(),
                    Xl(w),
                    r.call(w),
                    D.start()
            }
        }
        function a() {
            var t = this.__brush || {
                selection: null
            };
            return t.extent = s.apply(this, arguments),
                t.dim = n,
                t
        }
        var c, s = se, f = ce, l = h(e, "start", "brush", "end"), p = 6;
        return e.move = function(t, e) {
            t.selection ? t.on("start.brush", function() {
                i(this, arguments).beforestart().start()
            }).on("interrupt.brush end.brush", function() {
                i(this, arguments).end()
            }).tween("brush", function() {
                function t(t) {
                    u.selection = 1 === t && le(s) ? null : f(t),
                        r.call(o),
                        a.brush()
                }
                var o = this
                    , u = o.__brush
                    , a = i(o, arguments)
                    , c = u.selection
                    , s = n.input("function" == typeof e ? e.apply(this, arguments) : e, u.extent)
                    , f = fl(c, s);
                return c && s ? t : t(1)
            }) : t.each(function() {
                var t = this
                    , o = arguments
                    , u = t.__brush
                    , a = n.input("function" == typeof e ? e.apply(t, o) : e, u.extent)
                    , c = i(t, o).beforestart();
                Xl(t),
                    u.selection = null == a || le(a) ? null : a,
                    r.call(t),
                    c.start().brush().end()
            })
        }
            ,
            o.prototype = {
                beforestart: function() {
                    return 1 == ++this.active && (this.state.emitter = this,
                        this.starting = !0),
                        this
                },
                start: function() {
                    return this.starting && (this.starting = !1,
                        this.emit("start")),
                        this
                },
                brush: function() {
                    return this.emit("brush"),
                        this
                },
                end: function() {
                    return 0 == --this.active && (delete this.state.emitter,
                        this.emit("end")),
                        this
                },
                emit: function(t) {
                    k(new bh(e,t,n.output(this.state.selection)), l.apply, l, [t, this.that, this.args])
                }
            },
            e.extent = function(t) {
                return arguments.length ? (s = "function" == typeof t ? t : xh([[+t[0][0], +t[0][1]], [+t[1][0], +t[1][1]]]),
                    e) : s
            }
            ,
            e.filter = function(t) {
                return arguments.length ? (f = "function" == typeof t ? t : xh(!!t),
                    e) : f
            }
            ,
            e.handleSize = function(t) {
                return arguments.length ? (p = +t,
                    e) : p
            }
            ,
            e.on = function() {
                var t = l.on.apply(l, arguments);
                return t === l ? e : t
            }
            ,
            e
    }
    function pe(t) {
        return function(n, e) {
            return t(n.source.value + n.target.value, e.source.value + e.target.value)
        }
    }
    function de() {
        this._x0 = this._y0 = this._x1 = this._y1 = null,
            this._ = ""
    }
    function ve() {
        return new de
    }
    function _e(t) {
        return t.source
    }
    function ge(t) {
        return t.target
    }
    function ye(t) {
        return t.radius
    }
    function me(t) {
        return t.startAngle
    }
    function xe(t) {
        return t.endAngle
    }
    function be() {}
    function we(t, n) {
        var e = new be;
        if (t instanceof be)
            t.each(function(t, n) {
                e.set(n, t)
            });
        else if (Array.isArray(t)) {
            var r, i = -1, o = t.length;
            if (null == n)
                for (; ++i < o; )
                    e.set(i, t[i]);
            else
                for (; ++i < o; )
                    e.set(n(r = t[i], i, t), r)
        } else if (t)
            for (var u in t)
                e.set(u, t[u]);
        return e
    }
    function Me() {
        return {}
    }
    function Te(t, n, e) {
        t[n] = e
    }
    function Ne() {
        return we()
    }
    function ke(t, n, e) {
        t.set(n, e)
    }
    function Se() {}
    function Ee(t, n) {
        var e = new Se;
        if (t instanceof Se)
            t.each(function(t) {
                e.add(t)
            });
        else if (t) {
            var r = -1
                , i = t.length;
            if (null == n)
                for (; ++r < i; )
                    e.add(t[r]);
            else
                for (; ++r < i; )
                    e.add(n(t[r], r, t))
        }
        return e
    }
    function Ae(t) {
        return new Function("d","return {" + t.map(function(t, n) {
            return JSON.stringify(t) + ": d[" + n + "]"
        }).join(",") + "}")
    }
    function Ce(t, n) {
        var e = Ae(t);
        return function(r, i) {
            return n(e(r), i, t)
        }
    }
    function ze(t) {
        var n = Object.create(null)
            , e = [];
        return t.forEach(function(t) {
            for (var r in t)
                r in n || e.push(n[r] = r)
        }),
            e
    }
    function Pe(t, n, e, r) {
        if (isNaN(n) || isNaN(e))
            return t;
        var i, o, u, a, c, s, f, l, h, p = t._root, d = {
            data: r
        }, v = t._x0, _ = t._y0, g = t._x1, y = t._y1;
        if (!p)
            return t._root = d,
                t;
        for (; p.length; )
            if ((s = n >= (o = (v + g) / 2)) ? v = o : g = o,
                    (f = e >= (u = (_ + y) / 2)) ? _ = u : y = u,
                    i = p,
                    !(p = p[l = f << 1 | s]))
                return i[l] = d,
                    t;
        if (a = +t._x.call(null, p.data),
                c = +t._y.call(null, p.data),
            n === a && e === c)
            return d.next = p,
                i ? i[l] = d : t._root = d,
                t;
        do {
            i = i ? i[l] = new Array(4) : t._root = new Array(4),
                (s = n >= (o = (v + g) / 2)) ? v = o : g = o,
                (f = e >= (u = (_ + y) / 2)) ? _ = u : y = u
        } while ((l = f << 1 | s) == (h = (c >= u) << 1 | a >= o));return i[h] = p,
            i[l] = d,
            t
    }
    function Re(t) {
        return t[0]
    }
    function Le(t) {
        return t[1]
    }
    function qe(t, n, e) {
        var r = new Ue(null == n ? Re : n,null == e ? Le : e,NaN,NaN,NaN,NaN);
        return null == t ? r : r.addAll(t)
    }
    function Ue(t, n, e, r, i, o) {
        this._x = t,
            this._y = n,
            this._x0 = e,
            this._y0 = r,
            this._x1 = i,
            this._y1 = o,
            this._root = void 0
    }
    function De(t) {
        for (var n = {
            data: t.data
        }, e = n; t = t.next; )
            e = e.next = {
                data: t.data
            };
        return n
    }
    function Oe(t) {
        return t.x + t.vx
    }
    function Fe(t) {
        return t.y + t.vy
    }
    function Ie(t) {
        return t.index
    }
    function Ye(t, n) {
        var e = t.get(n);
        if (!e)
            throw new Error("missing: " + n);
        return e
    }
    function Be(t) {
        return t.x
    }
    function je(t) {
        return t.y
    }
    function He(t) {
        return new Xe(t)
    }
    function Xe(t) {
        if (!(n = wp.exec(t)))
            throw new Error("invalid format: " + t);
        var n, e = n[1] || " ", r = n[2] || ">", i = n[3] || "-", o = n[4] || "", u = !!n[5], a = n[6] && +n[6], c = !!n[7], s = n[8] && +n[8].slice(1), f = n[9] || "";
        "n" === f ? (c = !0,
            f = "g") : bp[f] || (f = ""),
        (u || "0" === e && "=" === r) && (u = !0,
            e = "0",
            r = "="),
            this.fill = e,
            this.align = r,
            this.sign = i,
            this.symbol = o,
            this.zero = u,
            this.width = a,
            this.comma = c,
            this.precision = s,
            this.type = f
    }
    function $e(n) {
        return Mp = kp(n),
            t.format = Mp.format,
            t.formatPrefix = Mp.formatPrefix,
            Mp
    }
    function Ve() {
        this.reset()
    }
    function We(t, n, e) {
        var r = t.s = n + e
            , i = r - n
            , o = r - i;
        t.t = n - o + (e - i)
    }
    function Ze(t) {
        return t > 1 ? 0 : t < -1 ? fd : Math.acos(t)
    }
    function Ge(t) {
        return t > 1 ? ld : t < -1 ? -ld : Math.asin(t)
    }
    function Je(t) {
        return (t = Td(t / 2)) * t
    }
    function Qe() {}
    function Ke(t, n) {
        t && Ad.hasOwnProperty(t.type) && Ad[t.type](t, n)
    }
    function tr(t, n, e) {
        var r, i = -1, o = t.length - e;
        for (n.lineStart(); ++i < o; )
            r = t[i],
                n.point(r[0], r[1], r[2]);
        n.lineEnd()
    }
    function nr(t, n) {
        var e = -1
            , r = t.length;
        for (n.polygonStart(); ++e < r; )
            tr(t[e], n, 1);
        n.polygonEnd()
    }
    function er() {
        Rd.point = ir
    }
    function rr() {
        or(zp, Pp)
    }
    function ir(t, n) {
        Rd.point = or,
            zp = t,
            Pp = n,
            Rp = t *= vd,
            Lp = md(n = (n *= vd) / 2 + hd),
            qp = Td(n)
    }
    function or(t, n) {
        n = (n *= vd) / 2 + hd;
        var e = (t *= vd) - Rp
            , r = e >= 0 ? 1 : -1
            , i = r * e
            , o = md(n)
            , u = Td(n)
            , a = qp * u
            , c = Lp * o + a * md(i)
            , s = a * r * Td(i);
        zd.add(yd(s, c)),
            Rp = t,
            Lp = o,
            qp = u
    }
    function ur(t) {
        return [yd(t[1], t[0]), Ge(t[2])]
    }
    function ar(t) {
        var n = t[0]
            , e = t[1]
            , r = md(e);
        return [r * md(n), r * Td(n), Td(e)]
    }
    function cr(t, n) {
        return t[0] * n[0] + t[1] * n[1] + t[2] * n[2]
    }
    function sr(t, n) {
        return [t[1] * n[2] - t[2] * n[1], t[2] * n[0] - t[0] * n[2], t[0] * n[1] - t[1] * n[0]]
    }
    function fr(t, n) {
        t[0] += n[0],
            t[1] += n[1],
            t[2] += n[2]
    }
    function lr(t, n) {
        return [t[0] * n, t[1] * n, t[2] * n]
    }
    function hr(t) {
        var n = kd(t[0] * t[0] + t[1] * t[1] + t[2] * t[2]);
        t[0] /= n,
            t[1] /= n,
            t[2] /= n
    }
    function pr(t, n) {
        Hp.push(Xp = [Up = t, Op = t]),
        n < Dp && (Dp = n),
        n > Fp && (Fp = n)
    }
    function dr(t, n) {
        var e = ar([t * vd, n * vd]);
        if (jp) {
            var r = sr(jp, e)
                , i = sr([r[1], -r[0], 0], r);
            hr(i),
                i = ur(i);
            var o, u = t - Ip, a = u > 0 ? 1 : -1, c = i[0] * dd * a, s = _d(u) > 180;
            s ^ (a * Ip < c && c < a * t) ? (o = i[1] * dd) > Fp && (Fp = o) : (c = (c + 360) % 360 - 180,
                s ^ (a * Ip < c && c < a * t) ? (o = -i[1] * dd) < Dp && (Dp = o) : (n < Dp && (Dp = n),
                n > Fp && (Fp = n))),
                s ? t < Ip ? xr(Up, t) > xr(Up, Op) && (Op = t) : xr(t, Op) > xr(Up, Op) && (Up = t) : Op >= Up ? (t < Up && (Up = t),
                t > Op && (Op = t)) : t > Ip ? xr(Up, t) > xr(Up, Op) && (Op = t) : xr(t, Op) > xr(Up, Op) && (Up = t)
        } else
            Hp.push(Xp = [Up = t, Op = t]);
        n < Dp && (Dp = n),
        n > Fp && (Fp = n),
            jp = e,
            Ip = t
    }
    function vr() {
        qd.point = dr
    }
    function _r() {
        Xp[0] = Up,
            Xp[1] = Op,
            qd.point = pr,
            jp = null
    }
    function gr(t, n) {
        if (jp) {
            var e = t - Ip;
            Ld.add(_d(e) > 180 ? e + (e > 0 ? 360 : -360) : e)
        } else
            Yp = t,
                Bp = n;
        Rd.point(t, n),
            dr(t, n)
    }
    function yr() {
        Rd.lineStart()
    }
    function mr() {
        gr(Yp, Bp),
            Rd.lineEnd(),
        _d(Ld) > sd && (Up = -(Op = 180)),
            Xp[0] = Up,
            Xp[1] = Op,
            jp = null
    }
    function xr(t, n) {
        return (n -= t) < 0 ? n + 360 : n
    }
    function br(t, n) {
        return t[0] - n[0]
    }
    function wr(t, n) {
        return t[0] <= t[1] ? t[0] <= n && n <= t[1] : n < t[0] || t[1] < n
    }
    function Mr(t, n) {
        t *= vd;
        var e = md(n *= vd);
        Tr(e * md(t), e * Td(t), Td(n))
    }
    function Tr(t, n, e) {
        Wp += (t - Wp) / ++$p,
            Zp += (n - Zp) / $p,
            Gp += (e - Gp) / $p
    }
    function Nr() {
        Ud.point = kr
    }
    function kr(t, n) {
        t *= vd;
        var e = md(n *= vd);
        od = e * md(t),
            ud = e * Td(t),
            ad = Td(n),
            Ud.point = Sr,
            Tr(od, ud, ad)
    }
    function Sr(t, n) {
        t *= vd;
        var e = md(n *= vd)
            , r = e * md(t)
            , i = e * Td(t)
            , o = Td(n)
            , u = yd(kd((u = ud * o - ad * i) * u + (u = ad * r - od * o) * u + (u = od * i - ud * r) * u), od * r + ud * i + ad * o);
        Vp += u,
            Jp += u * (od + (od = r)),
            Qp += u * (ud + (ud = i)),
            Kp += u * (ad + (ad = o)),
            Tr(od, ud, ad)
    }
    function Er() {
        Ud.point = Mr
    }
    function Ar() {
        Ud.point = zr
    }
    function Cr() {
        Pr(rd, id),
            Ud.point = Mr
    }
    function zr(t, n) {
        rd = t,
            id = n,
            t *= vd,
            n *= vd,
            Ud.point = Pr;
        var e = md(n);
        od = e * md(t),
            ud = e * Td(t),
            ad = Td(n),
            Tr(od, ud, ad)
    }
    function Pr(t, n) {
        t *= vd;
        var e = md(n *= vd)
            , r = e * md(t)
            , i = e * Td(t)
            , o = Td(n)
            , u = ud * o - ad * i
            , a = ad * r - od * o
            , c = od * i - ud * r
            , s = kd(u * u + a * a + c * c)
            , f = Ge(s)
            , l = s && -f / s;
        td += l * u,
            nd += l * a,
            ed += l * c,
            Vp += f,
            Jp += f * (od + (od = r)),
            Qp += f * (ud + (ud = i)),
            Kp += f * (ad + (ad = o)),
            Tr(od, ud, ad)
    }
    function Rr(t, n) {
        return [t > fd ? t - pd : t < -fd ? t + pd : t, n]
    }
    function Lr(t, n, e) {
        return (t %= pd) ? n || e ? Od(Ur(t), Dr(n, e)) : Ur(t) : n || e ? Dr(n, e) : Rr
    }
    function qr(t) {
        return function(n, e) {
            return n += t,
                [n > fd ? n - pd : n < -fd ? n + pd : n, e]
        }
    }
    function Ur(t) {
        var n = qr(t);
        return n.invert = qr(-t),
            n
    }
    function Dr(t, n) {
        function e(t, n) {
            var e = md(n)
                , a = md(t) * e
                , c = Td(t) * e
                , s = Td(n)
                , f = s * r + a * i;
            return [yd(c * o - f * u, a * r - s * i), Ge(f * o + c * u)]
        }
        var r = md(t)
            , i = Td(t)
            , o = md(n)
            , u = Td(n);
        return e.invert = function(t, n) {
            var e = md(n)
                , a = md(t) * e
                , c = Td(t) * e
                , s = Td(n)
                , f = s * o - c * u;
            return [yd(c * o + s * u, a * r + f * i), Ge(f * r - a * i)]
        }
            ,
            e
    }
    function Or(t, n, e, r, i, o) {
        if (e) {
            var u = md(n)
                , a = Td(n)
                , c = r * e;
            null == i ? (i = n + r * pd,
                o = n - c / 2) : (i = Fr(u, i),
                o = Fr(u, o),
            (r > 0 ? i < o : i > o) && (i += r * pd));
            for (var s, f = i; r > 0 ? f > o : f < o; f -= c)
                s = ur([u, -a * md(f), -a * Td(f)]),
                    t.point(s[0], s[1])
        }
    }
    function Fr(t, n) {
        (n = ar(n))[0] -= t,
            hr(n);
        var e = Ze(-n[1]);
        return ((-n[2] < 0 ? -e : e) + pd - sd) % pd
    }
    function Ir(t, n, e, r) {
        this.x = t,
            this.z = n,
            this.o = e,
            this.e = r,
            this.v = !1,
            this.n = this.p = null
    }
    function Yr(t) {
        if (n = t.length) {
            for (var n, e, r = 0, i = t[0]; ++r < n; )
                i.n = e = t[r],
                    e.p = i,
                    i = e;
            i.n = e = t[0],
                e.p = i
        }
    }
    function Br(t) {
        return t.length > 1
    }
    function jr(t, n) {
        return ((t = t.x)[0] < 0 ? t[1] - ld - sd : ld - t[1]) - ((n = n.x)[0] < 0 ? n[1] - ld - sd : ld - n[1])
    }
    function Hr(t, n, e, r) {
        var i, o, u = Td(t - e);
        return _d(u) > sd ? gd((Td(n) * (o = md(r)) * Td(e) - Td(r) * (i = md(n)) * Td(t)) / (i * o * u)) : (n + r) / 2
    }
    function Xr(t, n, e, r) {
        function i(i, o) {
            return t <= i && i <= e && n <= o && o <= r
        }
        function o(i, o, a, s) {
            var f = 0
                , l = 0;
            if (null == i || (f = u(i, a)) !== (l = u(o, a)) || c(i, o) < 0 ^ a > 0)
                do {
                    s.point(0 === f || 3 === f ? t : e, f > 1 ? r : n)
                } while ((f = (f + a + 4) % 4) !== l);
            else
                s.point(o[0], o[1])
        }
        function u(r, i) {
            return _d(r[0] - t) < sd ? i > 0 ? 0 : 3 : _d(r[0] - e) < sd ? i > 0 ? 2 : 1 : _d(r[1] - n) < sd ? i > 0 ? 1 : 0 : i > 0 ? 3 : 2
        }
        function a(t, n) {
            return c(t.x, n.x)
        }
        function c(t, n) {
            var e = u(t, 1)
                , r = u(n, 1);
            return e !== r ? e - r : 0 === e ? n[1] - t[1] : 1 === e ? t[0] - n[0] : 2 === e ? t[1] - n[1] : n[0] - t[0]
        }
        return function(u) {
            function c(t, n) {
                i(t, n) && w.point(t, n)
            }
            function s() {
                for (var n = 0, e = 0, i = h.length; e < i; ++e)
                    for (var o, u, a = h[e], c = 1, s = a.length, f = a[0], l = f[0], p = f[1]; c < s; ++c)
                        o = l,
                            u = p,
                            l = (f = a[c])[0],
                            p = f[1],
                            u <= r ? p > r && (l - o) * (r - u) > (p - u) * (t - o) && ++n : p <= r && (l - o) * (r - u) < (p - u) * (t - o) && --n;
                return n
            }
            function f(o, u) {
                var a = i(o, u);
                if (h && p.push([o, u]),
                        x)
                    d = o,
                        v = u,
                        _ = a,
                        x = !1,
                    a && (w.lineStart(),
                        w.point(o, u));
                else if (a && m)
                    w.point(o, u);
                else {
                    var c = [g = Math.max(av, Math.min(uv, g)), y = Math.max(av, Math.min(uv, y))]
                        , s = [o = Math.max(av, Math.min(uv, o)), u = Math.max(av, Math.min(uv, u))];
                    ov(c, s, t, n, e, r) ? (m || (w.lineStart(),
                        w.point(c[0], c[1])),
                        w.point(s[0], s[1]),
                    a || w.lineEnd(),
                        b = !1) : a && (w.lineStart(),
                        w.point(o, u),
                        b = !1)
                }
                g = o,
                    y = u,
                    m = a
            }
            var l, h, p, d, v, _, g, y, m, x, b, w = u, M = Jd(), T = {
                point: c,
                lineStart: function() {
                    T.point = f,
                    h && h.push(p = []),
                        x = !0,
                        m = !1,
                        g = y = NaN
                },
                lineEnd: function() {
                    l && (f(d, v),
                    _ && m && M.rejoin(),
                        l.push(M.result())),
                        T.point = c,
                    m && w.lineEnd()
                },
                polygonStart: function() {
                    w = M,
                        l = [],
                        h = [],
                        b = !0
                },
                polygonEnd: function() {
                    var t = s()
                        , n = b && t
                        , e = (l = Ps(l)).length;
                    (n || e) && (u.polygonStart(),
                    n && (u.lineStart(),
                        o(null, null, 1, u),
                        u.lineEnd()),
                    e && Kd(l, a, t, o, u),
                        u.polygonEnd()),
                        w = u,
                        l = h = p = null
                }
            };
            return T
        }
    }
    function $r() {
        sv.point = sv.lineEnd = Qe
    }
    function Vr(t, n) {
        Fd = t *= vd,
            Id = Td(n *= vd),
            Yd = md(n),
            sv.point = Wr
    }
    function Wr(t, n) {
        t *= vd;
        var e = Td(n *= vd)
            , r = md(n)
            , i = _d(t - Fd)
            , o = md(i)
            , u = r * Td(i)
            , a = Yd * e - Id * r * o
            , c = Id * e + Yd * r * o;
        cv.add(yd(kd(u * u + a * a), c)),
            Fd = t,
            Id = e,
            Yd = r
    }
    function Zr(t, n) {
        return !(!t || !vv.hasOwnProperty(t.type)) && vv[t.type](t, n)
    }
    function Gr(t, n) {
        return 0 === pv(t, n)
    }
    function Jr(t, n) {
        var e = pv(t[0], t[1]);
        return pv(t[0], n) + pv(n, t[1]) <= e + sd
    }
    function Qr(t, n) {
        return !!nv(t.map(Kr), ti(n))
    }
    function Kr(t) {
        return (t = t.map(ti)).pop(),
            t
    }
    function ti(t) {
        return [t[0] * vd, t[1] * vd]
    }
    function ni(t, n, e) {
        var r = Ns(t, n - sd, e).concat(n);
        return function(t) {
            return r.map(function(n) {
                return [t, n]
            })
        }
    }
    function ei(t, n, e) {
        var r = Ns(t, n - sd, e).concat(n);
        return function(t) {
            return r.map(function(n) {
                return [n, t]
            })
        }
    }
    function ri() {
        function t() {
            return {
                type: "MultiLineString",
                coordinates: n()
            }
        }
        function n() {
            return Ns(xd(o / _) * _, i, _).map(h).concat(Ns(xd(s / g) * g, c, g).map(p)).concat(Ns(xd(r / d) * d, e, d).filter(function(t) {
                return _d(t % _) > sd
            }).map(f)).concat(Ns(xd(a / v) * v, u, v).filter(function(t) {
                return _d(t % g) > sd
            }).map(l))
        }
        var e, r, i, o, u, a, c, s, f, l, h, p, d = 10, v = d, _ = 90, g = 360, y = 2.5;
        return t.lines = function() {
            return n().map(function(t) {
                return {
                    type: "LineString",
                    coordinates: t
                }
            })
        }
            ,
            t.outline = function() {
                return {
                    type: "Polygon",
                    coordinates: [h(o).concat(p(c).slice(1), h(i).reverse().slice(1), p(s).reverse().slice(1))]
                }
            }
            ,
            t.extent = function(n) {
                return arguments.length ? t.extentMajor(n).extentMinor(n) : t.extentMinor()
            }
            ,
            t.extentMajor = function(n) {
                return arguments.length ? (o = +n[0][0],
                    i = +n[1][0],
                    s = +n[0][1],
                    c = +n[1][1],
                o > i && (n = o,
                    o = i,
                    i = n),
                s > c && (n = s,
                    s = c,
                    c = n),
                    t.precision(y)) : [[o, s], [i, c]]
            }
            ,
            t.extentMinor = function(n) {
                return arguments.length ? (r = +n[0][0],
                    e = +n[1][0],
                    a = +n[0][1],
                    u = +n[1][1],
                r > e && (n = r,
                    r = e,
                    e = n),
                a > u && (n = a,
                    a = u,
                    u = n),
                    t.precision(y)) : [[r, a], [e, u]]
            }
            ,
            t.step = function(n) {
                return arguments.length ? t.stepMajor(n).stepMinor(n) : t.stepMinor()
            }
            ,
            t.stepMajor = function(n) {
                return arguments.length ? (_ = +n[0],
                    g = +n[1],
                    t) : [_, g]
            }
            ,
            t.stepMinor = function(n) {
                return arguments.length ? (d = +n[0],
                    v = +n[1],
                    t) : [d, v]
            }
            ,
            t.precision = function(n) {
                return arguments.length ? (y = +n,
                    f = ni(a, u, 90),
                    l = ei(r, e, y),
                    h = ni(s, c, 90),
                    p = ei(o, i, y),
                    t) : y
            }
            ,
            t.extentMajor([[-180, -90 + sd], [180, 90 - sd]]).extentMinor([[-180, -80 - sd], [180, 80 + sd]])
    }
    function ii() {
        mv.point = oi
    }
    function oi(t, n) {
        mv.point = ui,
            Bd = Hd = t,
            jd = Xd = n
    }
    function ui(t, n) {
        yv.add(Xd * t - Hd * n),
            Hd = t,
            Xd = n
    }
    function ai() {
        ui(Bd, jd)
    }
    function ci(t, n) {
        Nv += t,
            kv += n,
            ++Sv
    }
    function si() {
        Lv.point = fi
    }
    function fi(t, n) {
        Lv.point = li,
            ci(Wd = t, Zd = n)
    }
    function li(t, n) {
        var e = t - Wd
            , r = n - Zd
            , i = kd(e * e + r * r);
        Ev += i * (Wd + t) / 2,
            Av += i * (Zd + n) / 2,
            Cv += i,
            ci(Wd = t, Zd = n)
    }
    function hi() {
        Lv.point = ci
    }
    function pi() {
        Lv.point = vi
    }
    function di() {
        _i($d, Vd)
    }
    function vi(t, n) {
        Lv.point = _i,
            ci($d = Wd = t, Vd = Zd = n)
    }
    function _i(t, n) {
        var e = t - Wd
            , r = n - Zd
            , i = kd(e * e + r * r);
        Ev += i * (Wd + t) / 2,
            Av += i * (Zd + n) / 2,
            Cv += i,
            zv += (i = Zd * t - Wd * n) * (Wd + t),
            Pv += i * (Zd + n),
            Rv += 3 * i,
            ci(Wd = t, Zd = n)
    }
    function gi(t) {
        this._context = t
    }
    function yi(t, n) {
        Yv.point = mi,
            Uv = Ov = t,
            Dv = Fv = n
    }
    function mi(t, n) {
        Ov -= t,
            Fv -= n,
            Iv.add(kd(Ov * Ov + Fv * Fv)),
            Ov = t,
            Fv = n
    }
    function xi() {
        this._string = []
    }
    function bi(t) {
        return "m0," + t + "a" + t + "," + t + " 0 1,1 0," + -2 * t + "a" + t + "," + t + " 0 1,1 0," + 2 * t + "z"
    }
    function wi(t) {
        return function(n) {
            var e = new Mi;
            for (var r in t)
                e[r] = t[r];
            return e.stream = n,
                e
        }
    }
    function Mi() {}
    function Ti(t, n, e) {
        var r = n[1][0] - n[0][0]
            , i = n[1][1] - n[0][1]
            , o = t.clipExtent && t.clipExtent();
        t.scale(150).translate([0, 0]),
        null != o && t.clipExtent(null),
            Cd(e, t.stream(Tv));
        var u = Tv.result()
            , a = Math.min(r / (u[1][0] - u[0][0]), i / (u[1][1] - u[0][1]))
            , c = +n[0][0] + (r - a * (u[1][0] + u[0][0])) / 2
            , s = +n[0][1] + (i - a * (u[1][1] + u[0][1])) / 2;
        return null != o && t.clipExtent(o),
            t.scale(150 * a).translate([c, s])
    }
    function Ni(t, n, e) {
        return Ti(t, [[0, 0], n], e)
    }
    function ki(t) {
        return wi({
            point: function(n, e) {
                n = t(n, e),
                    this.stream.point(n[0], n[1])
            }
        })
    }
    function Si(t, n) {
        function e(r, i, o, u, a, c, s, f, l, h, p, d, v, _) {
            var g = s - r
                , y = f - i
                , m = g * g + y * y;
            if (m > 4 * n && v--) {
                var x = u + h
                    , b = a + p
                    , w = c + d
                    , M = kd(x * x + b * b + w * w)
                    , T = Ge(w /= M)
                    , N = _d(_d(w) - 1) < sd || _d(o - l) < sd ? (o + l) / 2 : yd(b, x)
                    , k = t(N, T)
                    , S = k[0]
                    , E = k[1]
                    , A = S - r
                    , C = E - i
                    , z = y * A - g * C;
                (z * z / m > n || _d((g * A + y * C) / m - .5) > .3 || u * h + a * p + c * d < jv) && (e(r, i, o, u, a, c, S, E, N, x /= M, b /= M, w, v, _),
                    _.point(S, E),
                    e(S, E, N, x, b, w, s, f, l, h, p, d, v, _))
            }
        }
        return function(n) {
            function r(e, r) {
                e = t(e, r),
                    n.point(e[0], e[1])
            }
            function i() {
                g = NaN,
                    w.point = o,
                    n.lineStart()
            }
            function o(r, i) {
                var o = ar([r, i])
                    , u = t(r, i);
                e(g, y, _, m, x, b, g = u[0], y = u[1], _ = r, m = o[0], x = o[1], b = o[2], Bv, n),
                    n.point(g, y)
            }
            function u() {
                w.point = r,
                    n.lineEnd()
            }
            function a() {
                i(),
                    w.point = c,
                    w.lineEnd = s
            }
            function c(t, n) {
                o(f = t, n),
                    l = g,
                    h = y,
                    p = m,
                    d = x,
                    v = b,
                    w.point = o
            }
            function s() {
                e(g, y, _, m, x, b, l, h, f, p, d, v, Bv, n),
                    w.lineEnd = u,
                    u()
            }
            var f, l, h, p, d, v, _, g, y, m, x, b, w = {
                point: r,
                lineStart: i,
                lineEnd: u,
                polygonStart: function() {
                    n.polygonStart(),
                        w.lineStart = a
                },
                polygonEnd: function() {
                    n.polygonEnd(),
                        w.lineStart = i
                }
            };
            return w
        }
    }
    function Ei(t) {
        return wi({
            point: function(n, e) {
                var r = t(n, e);
                return this.stream.point(r[0], r[1])
            }
        })
    }
    function Ai(t) {
        return Ci(function() {
            return t
        })()
    }
    function Ci(t) {
        function n(t) {
            return t = f(t[0] * vd, t[1] * vd),
                [t[0] * _ + a, c - t[1] * _]
        }
        function e(t) {
            return (t = f.invert((t[0] - a) / _, (c - t[1]) / _)) && [t[0] * dd, t[1] * dd]
        }
        function r(t, n) {
            return t = u(t, n),
                [t[0] * _ + a, c - t[1] * _]
        }
        function i() {
            f = Od(s = Lr(b, w, M), u);
            var t = u(m, x);
            return a = g - t[0] * _,
                c = y + t[1] * _,
                o()
        }
        function o() {
            return d = v = null,
                n
        }
        var u, a, c, s, f, l, h, p, d, v, _ = 150, g = 480, y = 250, m = 0, x = 0, b = 0, w = 0, M = 0, T = null, N = rv, k = null, S = _v, E = .5, A = Hv(r, E);
        return n.stream = function(t) {
            return d && v === t ? d : d = Xv(Ei(s)(N(A(S(v = t)))))
        }
            ,
            n.preclip = function(t) {
                return arguments.length ? (N = t,
                    T = void 0,
                    o()) : N
            }
            ,
            n.postclip = function(t) {
                return arguments.length ? (S = t,
                    k = l = h = p = null,
                    o()) : S
            }
            ,
            n.clipAngle = function(t) {
                return arguments.length ? (N = +t ? iv(T = t * vd) : (T = null,
                    rv),
                    o()) : T * dd
            }
            ,
            n.clipExtent = function(t) {
                return arguments.length ? (S = null == t ? (k = l = h = p = null,
                    _v) : Xr(k = +t[0][0], l = +t[0][1], h = +t[1][0], p = +t[1][1]),
                    o()) : null == k ? null : [[k, l], [h, p]]
            }
            ,
            n.scale = function(t) {
                return arguments.length ? (_ = +t,
                    i()) : _
            }
            ,
            n.translate = function(t) {
                return arguments.length ? (g = +t[0],
                    y = +t[1],
                    i()) : [g, y]
            }
            ,
            n.center = function(t) {
                return arguments.length ? (m = t[0] % 360 * vd,
                    x = t[1] % 360 * vd,
                    i()) : [m * dd, x * dd]
            }
            ,
            n.rotate = function(t) {
                return arguments.length ? (b = t[0] % 360 * vd,
                    w = t[1] % 360 * vd,
                    M = t.length > 2 ? t[2] % 360 * vd : 0,
                    i()) : [b * dd, w * dd, M * dd]
            }
            ,
            n.precision = function(t) {
                return arguments.length ? (A = Hv(r, E = t * t),
                    o()) : kd(E)
            }
            ,
            n.fitExtent = function(t, e) {
                return Ti(n, t, e)
            }
            ,
            n.fitSize = function(t, e) {
                return Ni(n, t, e)
            }
            ,
            function() {
                return u = t.apply(this, arguments),
                    n.invert = u.invert && e,
                    i()
            }
    }
    function zi(t) {
        var n = 0
            , e = fd / 3
            , r = Ci(t)
            , i = r(n, e);
        return i.parallels = function(t) {
            return arguments.length ? r(n = t[0] * vd, e = t[1] * vd) : [n * dd, e * dd]
        }
            ,
            i
    }
    function Pi(t) {
        function n(t, n) {
            return [t * e, Td(n) / e]
        }
        var e = md(t);
        return n.invert = function(t, n) {
            return [t / e, Ge(n * e)]
        }
            ,
            n
    }
    function Ri(t, n) {
        function e(t, n) {
            var e = kd(o - 2 * i * Td(n)) / i;
            return [e * Td(t *= i), u - e * md(t)]
        }
        var r = Td(t)
            , i = (r + Td(n)) / 2;
        if (_d(i) < sd)
            return Pi(t);
        var o = 1 + r * (2 * i - r)
            , u = kd(o) / i;
        return e.invert = function(t, n) {
            var e = u - n;
            return [yd(t, _d(e)) / i * Nd(e), Ge((o - (t * t + e * e) * i * i) / (2 * i))]
        }
            ,
            e
    }
    function Li(t) {
        var n = t.length;
        return {
            point: function(e, r) {
                for (var i = -1; ++i < n; )
                    t[i].point(e, r)
            },
            sphere: function() {
                for (var e = -1; ++e < n; )
                    t[e].sphere()
            },
            lineStart: function() {
                for (var e = -1; ++e < n; )
                    t[e].lineStart()
            },
            lineEnd: function() {
                for (var e = -1; ++e < n; )
                    t[e].lineEnd()
            },
            polygonStart: function() {
                for (var e = -1; ++e < n; )
                    t[e].polygonStart()
            },
            polygonEnd: function() {
                for (var e = -1; ++e < n; )
                    t[e].polygonEnd()
            }
        }
    }
    function qi(t) {
        return function(n, e) {
            var r = md(n)
                , i = md(e)
                , o = t(r * i);
            return [o * i * Td(n), o * Td(e)]
        }
    }
    function Ui(t) {
        return function(n, e) {
            var r = kd(n * n + e * e)
                , i = t(r)
                , o = Td(i)
                , u = md(i);
            return [yd(n * o, r * u), Ge(r && e * o / r)]
        }
    }
    function Di(t, n) {
        return [t, wd(Sd((ld + n) / 2))]
    }
    function Oi(t) {
        function n() {
            var n = fd * a()
                , u = o(Gd(o.rotate()).invert([0, 0]));
            return s(null == f ? [[u[0] - n, u[1] - n], [u[0] + n, u[1] + n]] : t === Di ? [[Math.max(u[0] - n, f), e], [Math.min(u[0] + n, r), i]] : [[f, Math.max(u[1] - n, e)], [r, Math.min(u[1] + n, i)]])
        }
        var e, r, i, o = Ai(t), u = o.center, a = o.scale, c = o.translate, s = o.clipExtent, f = null;
        return o.scale = function(t) {
            return arguments.length ? (a(t),
                n()) : a()
        }
            ,
            o.translate = function(t) {
                return arguments.length ? (c(t),
                    n()) : c()
            }
            ,
            o.center = function(t) {
                return arguments.length ? (u(t),
                    n()) : u()
            }
            ,
            o.clipExtent = function(t) {
                return arguments.length ? (null == t ? f = e = r = i = null : (f = +t[0][0],
                    e = +t[0][1],
                    r = +t[1][0],
                    i = +t[1][1]),
                    n()) : null == f ? null : [[f, e], [r, i]]
            }
            ,
            n()
    }
    function Fi(t) {
        return Sd((ld + t) / 2)
    }
    function Ii(t, n) {
        function e(t, n) {
            o > 0 ? n < -ld + sd && (n = -ld + sd) : n > ld - sd && (n = ld - sd);
            var e = o / Md(Fi(n), i);
            return [e * Td(i * t), o - e * md(i * t)]
        }
        var r = md(t)
            , i = t === n ? Td(t) : wd(r / md(n)) / wd(Fi(n) / Fi(t))
            , o = r * Md(Fi(t), i) / i;
        return i ? (e.invert = function(t, n) {
            var e = o - n
                , r = Nd(i) * kd(t * t + e * e);
            return [yd(t, _d(e)) / i * Nd(e), 2 * gd(Md(o / r, 1 / i)) - ld]
        }
            ,
            e) : Di
    }
    function Yi(t, n) {
        return [t, n]
    }
    function Bi(t, n) {
        function e(t, n) {
            var e = o - n
                , r = i * t;
            return [e * Td(r), o - e * md(r)]
        }
        var r = md(t)
            , i = t === n ? Td(t) : (r - md(n)) / (n - t)
            , o = r / i + t;
        return _d(i) < sd ? Yi : (e.invert = function(t, n) {
            var e = o - n;
            return [yd(t, _d(e)) / i * Nd(e), o - Nd(i) * kd(t * t + e * e)]
        }
            ,
            e)
    }
    function ji(t, n) {
        var e = md(n)
            , r = md(t) * e;
        return [e * Td(t) / r, Td(n) / r]
    }
    function Hi(t, n, e, r) {
        return 1 === t && 1 === n && 0 === e && 0 === r ? _v : wi({
            point: function(i, o) {
                this.stream.point(i * t + e, o * n + r)
            }
        })
    }
    function Xi(t, n) {
        var e = n * n
            , r = e * e;
        return [t * (.8707 - .131979 * e + r * (r * (.003971 * e - .001529 * r) - .013791)), n * (1.007226 + e * (.015085 + r * (.028874 * e - .044475 - .005916 * r)))]
    }
    function $i(t, n) {
        return [md(n) * Td(t), Td(n)]
    }
    function Vi(t, n) {
        var e = md(n)
            , r = 1 + md(t) * e;
        return [e * Td(t) / r, Td(n) / r]
    }
    function Wi(t, n) {
        return [wd(Sd((ld + n) / 2)), -t]
    }
    function Zi(t, n) {
        return t.parent === n.parent ? 1 : 2
    }
    function Gi(t) {
        return t.reduce(Ji, 0) / t.length
    }
    function Ji(t, n) {
        return t + n.x
    }
    function Qi(t) {
        return 1 + t.reduce(Ki, 0)
    }
    function Ki(t, n) {
        return Math.max(t, n.y)
    }
    function to(t) {
        for (var n; n = t.children; )
            t = n[0];
        return t
    }
    function no(t) {
        for (var n; n = t.children; )
            t = n[n.length - 1];
        return t
    }
    function eo(t) {
        var n = 0
            , e = t.children
            , r = e && e.length;
        if (r)
            for (; --r >= 0; )
                n += e[r].value;
        else
            n = 1;
        t.value = n
    }
    function ro(t, n) {
        if (t === n)
            return t;
        var e = t.ancestors()
            , r = n.ancestors()
            , i = null;
        for (t = e.pop(),
                 n = r.pop(); t === n; )
            i = t,
                t = e.pop(),
                n = r.pop();
        return i
    }
    function io(t, n) {
        var e, r, i, o, u, a = new co(t), c = +t.value && (a.value = t.value), s = [a];
        for (null == n && (n = oo); e = s.pop(); )
            if (c && (e.value = +e.data.value),
                (i = n(e.data)) && (u = i.length))
                for (e.children = new Array(u),
                         o = u - 1; o >= 0; --o)
                    s.push(r = e.children[o] = new co(i[o])),
                        r.parent = e,
                        r.depth = e.depth + 1;
        return a.eachBefore(ao)
    }
    function oo(t) {
        return t.children
    }
    function uo(t) {
        t.data = t.data.data
    }
    function ao(t) {
        var n = 0;
        do {
            t.height = n
        } while ((t = t.parent) && t.height < ++n)
    }
    function co(t) {
        this.data = t,
            this.depth = this.height = 0,
            this.parent = null
    }
    function so(t) {
        for (var n, e, r = t.length; r; )
            e = Math.random() * r-- | 0,
                n = t[r],
                t[r] = t[e],
                t[e] = n;
        return t
    }
    function fo(t, n) {
        var e, r;
        if (po(n, t))
            return [n];
        for (e = 0; e < t.length; ++e)
            if (lo(n, t[e]) && po(go(t[e], n), t))
                return [t[e], n];
        for (e = 0; e < t.length - 1; ++e)
            for (r = e + 1; r < t.length; ++r)
                if (lo(go(t[e], t[r]), n) && lo(go(t[e], n), t[r]) && lo(go(t[r], n), t[e]) && po(yo(t[e], t[r], n), t))
                    return [t[e], t[r], n];
        throw new Error
    }
    function lo(t, n) {
        var e = t.r - n.r
            , r = n.x - t.x
            , i = n.y - t.y;
        return e < 0 || e * e < r * r + i * i
    }
    function ho(t, n) {
        var e = t.r - n.r + 1e-6
            , r = n.x - t.x
            , i = n.y - t.y;
        return e > 0 && e * e > r * r + i * i
    }
    function po(t, n) {
        for (var e = 0; e < n.length; ++e)
            if (!ho(t, n[e]))
                return !1;
        return !0
    }
    function vo(t) {
        switch (t.length) {
            case 1:
                return _o(t[0]);
            case 2:
                return go(t[0], t[1]);
            case 3:
                return yo(t[0], t[1], t[2])
        }
    }
    function _o(t) {
        return {
            x: t.x,
            y: t.y,
            r: t.r
        }
    }
    function go(t, n) {
        var e = t.x
            , r = t.y
            , i = t.r
            , o = n.x
            , u = n.y
            , a = n.r
            , c = o - e
            , s = u - r
            , f = a - i
            , l = Math.sqrt(c * c + s * s);
        return {
            x: (e + o + c / l * f) / 2,
            y: (r + u + s / l * f) / 2,
            r: (l + i + a) / 2
        }
    }
    function yo(t, n, e) {
        var r = t.x
            , i = t.y
            , o = t.r
            , u = n.x
            , a = n.y
            , c = n.r
            , s = e.x
            , f = e.y
            , l = e.r
            , h = r - u
            , p = r - s
            , d = i - a
            , v = i - f
            , _ = c - o
            , g = l - o
            , y = r * r + i * i - o * o
            , m = y - u * u - a * a + c * c
            , x = y - s * s - f * f + l * l
            , b = p * d - h * v
            , w = (d * x - v * m) / (2 * b) - r
            , M = (v * _ - d * g) / b
            , T = (p * m - h * x) / (2 * b) - i
            , N = (h * g - p * _) / b
            , k = M * M + N * N - 1
            , S = 2 * (o + w * M + T * N)
            , E = w * w + T * T - o * o
            , A = -(k ? (S + Math.sqrt(S * S - 4 * k * E)) / (2 * k) : E / S);
        return {
            x: r + w + M * A,
            y: i + T + N * A,
            r: A
        }
    }
    function mo(t, n, e) {
        var r = t.x
            , i = t.y
            , o = n.r + e.r
            , u = t.r + e.r
            , a = n.x - r
            , c = n.y - i
            , s = a * a + c * c;
        if (s) {
            var f = .5 + ((u *= u) - (o *= o)) / (2 * s)
                , l = Math.sqrt(Math.max(0, 2 * o * (u + s) - (u -= s) * u - o * o)) / (2 * s);
            e.x = r + f * a + l * c,
                e.y = i + f * c - l * a
        } else
            e.x = r + u,
                e.y = i
    }
    function xo(t, n) {
        var e = n.x - t.x
            , r = n.y - t.y
            , i = t.r + n.r;
        return i * i - 1e-6 > e * e + r * r
    }
    function bo(t) {
        var n = t._
            , e = t.next._
            , r = n.r + e.r
            , i = (n.x * e.r + e.x * n.r) / r
            , o = (n.y * e.r + e.y * n.r) / r;
        return i * i + o * o
    }
    function wo(t) {
        this._ = t,
            this.next = null,
            this.previous = null
    }
    function Mo(t) {
        if (!(i = t.length))
            return 0;
        var n, e, r, i, o, u, a, c, s, f, l;
        if (n = t[0],
                n.x = 0,
                n.y = 0,
                !(i > 1))
            return n.r;
        if (e = t[1],
                n.x = -e.r,
                e.x = n.r,
                e.y = 0,
                !(i > 2))
            return n.r + e.r;
        mo(e, n, r = t[2]),
            n = new wo(n),
            e = new wo(e),
            r = new wo(r),
            n.next = r.previous = e,
            e.next = n.previous = r,
            r.next = e.previous = n;
        t: for (a = 3; a < i; ++a) {
            mo(n._, e._, r = t[a]),
                r = new wo(r),
                c = e.next,
                s = n.previous,
                f = e._.r,
                l = n._.r;
            do {
                if (f <= l) {
                    if (xo(c._, r._)) {
                        e = c,
                            n.next = e,
                            e.previous = n,
                            --a;
                        continue t
                    }
                    f += c._.r,
                        c = c.next
                } else {
                    if (xo(s._, r._)) {
                        (n = s).next = e,
                            e.previous = n,
                            --a;
                        continue t
                    }
                    l += s._.r,
                        s = s.previous
                }
            } while (c !== s.next);for (r.previous = n,
                                            r.next = e,
                                            n.next = e.previous = e = r,
                                            o = bo(n); (r = r.next) !== e; )
                (u = bo(r)) < o && (n = r,
                    o = u);
            e = n.next
        }
        for (n = [e._],
                 r = e; (r = r.next) !== e; )
            n.push(r._);
        for (r = Jv(n),
                 a = 0; a < i; ++a)
            n = t[a],
                n.x -= r.x,
                n.y -= r.y;
        return r.r
    }
    function To(t) {
        return null == t ? null : No(t)
    }
    function No(t) {
        if ("function" != typeof t)
            throw new Error;
        return t
    }
    function ko() {
        return 0
    }
    function So(t) {
        return Math.sqrt(t.value)
    }
    function Eo(t) {
        return function(n) {
            n.children || (n.r = Math.max(0, +t(n) || 0))
        }
    }
    function Ao(t, n) {
        return function(e) {
            if (r = e.children) {
                var r, i, o, u = r.length, a = t(e) * n || 0;
                if (a)
                    for (i = 0; i < u; ++i)
                        r[i].r += a;
                if (o = Mo(r),
                        a)
                    for (i = 0; i < u; ++i)
                        r[i].r -= a;
                e.r = o + a
            }
        }
    }
    function Co(t) {
        return function(n) {
            var e = n.parent;
            n.r *= t,
            e && (n.x = e.x + t * n.x,
                n.y = e.y + t * n.y)
        }
    }
    function zo(t) {
        return t.id
    }
    function Po(t) {
        return t.parentId
    }
    function Ro(t, n) {
        return t.parent === n.parent ? 1 : 2
    }
    function Lo(t) {
        var n = t.children;
        return n ? n[0] : t.t
    }
    function qo(t) {
        var n = t.children;
        return n ? n[n.length - 1] : t.t
    }
    function Uo(t, n, e) {
        var r = e / (n.i - t.i);
        n.c -= r,
            n.s += e,
            t.c += r,
            n.z += e,
            n.m += e
    }
    function Do(t) {
        for (var n, e = 0, r = 0, i = t.children, o = i.length; --o >= 0; )
            (n = i[o]).z += e,
                n.m += e,
                e += n.s + (r += n.c)
    }
    function Oo(t, n, e) {
        return t.a.parent === n.parent ? t.a : e
    }
    function Fo(t, n) {
        this._ = t,
            this.parent = null,
            this.children = null,
            this.A = null,
            this.a = this,
            this.z = 0,
            this.m = 0,
            this.c = 0,
            this.s = 0,
            this.t = null,
            this.i = n
    }
    function Io(t) {
        for (var n, e, r, i, o, u = new Fo(t,0), a = [u]; n = a.pop(); )
            if (r = n._.children)
                for (n.children = new Array(o = r.length),
                         i = o - 1; i >= 0; --i)
                    a.push(e = n.children[i] = new Fo(r[i],i)),
                        e.parent = n;
        return (u.parent = new Fo(null,0)).children = [u],
            u
    }
    function Yo(t, n, e, r, i, o) {
        for (var u, a, c, s, f, l, h, p, d, v, _, g = [], y = n.children, m = 0, x = 0, b = y.length, w = n.value; m < b; ) {
            c = i - e,
                s = o - r;
            do {
                f = y[x++].value
            } while (!f && x < b);for (l = h = f,
                                           _ = f * f * (v = Math.max(s / c, c / s) / (w * t)),
                                           d = Math.max(h / _, _ / l); x < b; ++x) {
                if (f += a = y[x].value,
                    a < l && (l = a),
                    a > h && (h = a),
                        _ = f * f * v,
                    (p = Math.max(h / _, _ / l)) > d) {
                    f -= a;
                    break
                }
                d = p
            }
            g.push(u = {
                value: f,
                dice: c < s,
                children: y.slice(m, x)
            }),
                u.dice ? t_(u, e, r, i, w ? r += s * f / w : o) : i_(u, e, r, w ? e += c * f / w : i, o),
                w -= f,
                m = x
        }
        return g
    }
    function Bo(t, n) {
        return t[0] - n[0] || t[1] - n[1]
    }
    function jo(t) {
        for (var n = t.length, e = [0, 1], r = 2, i = 2; i < n; ++i) {
            for (; r > 1 && c_(t[e[r - 2]], t[e[r - 1]], t[i]) <= 0; )
                --r;
            e[r++] = i
        }
        return e.slice(0, r)
    }
    function Ho(t) {
        this._size = t,
            this._call = this._error = null,
            this._tasks = [],
            this._data = [],
            this._waiting = this._active = this._ended = this._start = 0
    }
    function Xo(t) {
        if (!t._start)
            try {
                $o(t)
            } catch (n) {
                if (t._tasks[t._ended + t._active - 1])
                    Wo(t, n);
                else if (!t._data)
                    throw n
            }
    }
    function $o(t) {
        for (; t._start = t._waiting && t._active < t._size; ) {
            var n = t._ended + t._active
                , e = t._tasks[n]
                , r = e.length - 1
                , i = e[r];
            e[r] = Vo(t, n),
                --t._waiting,
                ++t._active,
                e = i.apply(null, e),
            t._tasks[n] && (t._tasks[n] = e || f_)
        }
    }
    function Vo(t, n) {
        return function(e, r) {
            t._tasks[n] && (--t._active,
                ++t._ended,
                t._tasks[n] = null,
            null == t._error && (null != e ? Wo(t, e) : (t._data[n] = r,
                t._waiting ? Xo(t) : Zo(t))))
        }
    }
    function Wo(t, n) {
        var e, r = t._tasks.length;
        for (t._error = n,
                 t._data = void 0,
                 t._waiting = NaN; --r >= 0; )
            if ((e = t._tasks[r]) && (t._tasks[r] = null,
                    e.abort))
                try {
                    e.abort()
                } catch (n) {}
        t._active = NaN,
            Zo(t)
    }
    function Zo(t) {
        if (!t._active && t._call) {
            var n = t._data;
            t._data = void 0,
                t._call(t._error, n)
        }
    }
    function Go(t) {
        if (null == t)
            t = 1 / 0;
        else if (!((t = +t) >= 1))
            throw new Error("invalid concurrency");
        return new Ho(t)
    }
    function Jo(t) {
        return function(n, e) {
            t(null == n ? e : null)
        }
    }
    function Qo(t) {
        var n = t.responseType;
        return n && "text" !== n ? t.response : t.responseText
    }
    function Ko(t, n) {
        return function(e) {
            return t(e.responseText, n)
        }
    }
    function tu(t) {
        function n(n) {
            var o = n + ""
                , u = e.get(o);
            if (!u) {
                if (i !== C_)
                    return i;
                e.set(o, u = r.push(n))
            }
            return t[(u - 1) % t.length]
        }
        var e = we()
            , r = []
            , i = C_;
        return t = null == t ? [] : A_.call(t),
            n.domain = function(t) {
                if (!arguments.length)
                    return r.slice();
                r = [],
                    e = we();
                for (var i, o, u = -1, a = t.length; ++u < a; )
                    e.has(o = (i = t[u]) + "") || e.set(o, r.push(i));
                return n
            }
            ,
            n.range = function(e) {
                return arguments.length ? (t = A_.call(e),
                    n) : t.slice()
            }
            ,
            n.unknown = function(t) {
                return arguments.length ? (i = t,
                    n) : i
            }
            ,
            n.copy = function() {
                return tu().domain(r).range(t).unknown(i)
            }
            ,
            n
    }
    function nu() {
        function t() {
            var t = i().length
                , r = u[1] < u[0]
                , l = u[r - 0]
                , h = u[1 - r];
            n = (h - l) / Math.max(1, t - c + 2 * s),
            a && (n = Math.floor(n)),
                l += (h - l - n * (t - c)) * f,
                e = n * (1 - c),
            a && (l = Math.round(l),
                e = Math.round(e));
            var p = Ns(t).map(function(t) {
                return l + n * t
            });
            return o(r ? p.reverse() : p)
        }
        var n, e, r = tu().unknown(void 0), i = r.domain, o = r.range, u = [0, 1], a = !1, c = 0, s = 0, f = .5;
        return delete r.unknown,
            r.domain = function(n) {
                return arguments.length ? (i(n),
                    t()) : i()
            }
            ,
            r.range = function(n) {
                return arguments.length ? (u = [+n[0], +n[1]],
                    t()) : u.slice()
            }
            ,
            r.rangeRound = function(n) {
                return u = [+n[0], +n[1]],
                    a = !0,
                    t()
            }
            ,
            r.bandwidth = function() {
                return e
            }
            ,
            r.step = function() {
                return n
            }
            ,
            r.round = function(n) {
                return arguments.length ? (a = !!n,
                    t()) : a
            }
            ,
            r.padding = function(n) {
                return arguments.length ? (c = s = Math.max(0, Math.min(1, n)),
                    t()) : c
            }
            ,
            r.paddingInner = function(n) {
                return arguments.length ? (c = Math.max(0, Math.min(1, n)),
                    t()) : c
            }
            ,
            r.paddingOuter = function(n) {
                return arguments.length ? (s = Math.max(0, Math.min(1, n)),
                    t()) : s
            }
            ,
            r.align = function(n) {
                return arguments.length ? (f = Math.max(0, Math.min(1, n)),
                    t()) : f
            }
            ,
            r.copy = function() {
                return nu().domain(i()).range(u).round(a).paddingInner(c).paddingOuter(s).align(f)
            }
            ,
            t()
    }
    function eu(t) {
        var n = t.copy;
        return t.padding = t.paddingOuter,
            delete t.paddingInner,
            delete t.paddingOuter,
            t.copy = function() {
                return eu(n())
            }
            ,
            t
    }
    function ru(t, n) {
        return (n -= t = +t) ? function(e) {
                return (e - t) / n
            }
            : z_(n)
    }
    function iu(t) {
        return function(n, e) {
            var r = t(n = +n, e = +e);
            return function(t) {
                return t <= n ? 0 : t >= e ? 1 : r(t)
            }
        }
    }
    function ou(t) {
        return function(n, e) {
            var r = t(n = +n, e = +e);
            return function(t) {
                return t <= 0 ? n : t >= 1 ? e : r(t)
            }
        }
    }
    function uu(t, n, e, r) {
        var i = t[0]
            , o = t[1]
            , u = n[0]
            , a = n[1];
        return o < i ? (i = e(o, i),
            u = r(a, u)) : (i = e(i, o),
            u = r(u, a)),
            function(t) {
                return u(i(t))
            }
    }
    function au(t, n, e, r) {
        var i = Math.min(t.length, n.length) - 1
            , o = new Array(i)
            , u = new Array(i)
            , a = -1;
        for (t[i] < t[0] && (t = t.slice().reverse(),
            n = n.slice().reverse()); ++a < i; )
            o[a] = e(t[a], t[a + 1]),
                u[a] = r(n[a], n[a + 1]);
        return function(n) {
            var e = ds(t, n, 1, i) - 1;
            return u[e](o[e](n))
        }
    }
    function cu(t, n) {
        return n.domain(t.domain()).range(t.range()).interpolate(t.interpolate()).clamp(t.clamp())
    }
    function su(t, n) {
        function e() {
            return i = Math.min(a.length, c.length) > 2 ? au : uu,
                o = u = null,
                r
        }
        function r(n) {
            return (o || (o = i(a, c, f ? iu(t) : t, s)))(+n)
        }
        var i, o, u, a = R_, c = R_, s = fl, f = !1;
        return r.invert = function(t) {
            return (u || (u = i(c, a, ru, f ? ou(n) : n)))(+t)
        }
            ,
            r.domain = function(t) {
                return arguments.length ? (a = E_.call(t, P_),
                    e()) : a.slice()
            }
            ,
            r.range = function(t) {
                return arguments.length ? (c = A_.call(t),
                    e()) : c.slice()
            }
            ,
            r.rangeRound = function(t) {
                return c = A_.call(t),
                    s = ll,
                    e()
            }
            ,
            r.clamp = function(t) {
                return arguments.length ? (f = !!t,
                    e()) : f
            }
            ,
            r.interpolate = function(t) {
                return arguments.length ? (s = t,
                    e()) : s
            }
            ,
            e()
    }
    function fu(t) {
        var n = t.domain;
        return t.ticks = function(t) {
            var e = n();
            return As(e[0], e[e.length - 1], null == t ? 10 : t)
        }
            ,
            t.tickFormat = function(t, e) {
                return L_(n(), t, e)
            }
            ,
            t.nice = function(e) {
                null == e && (e = 10);
                var i, o = n(), u = 0, a = o.length - 1, c = o[u], s = o[a];
                return s < c && (i = c,
                    c = s,
                    s = i,
                    i = u,
                    u = a,
                    a = i),
                    (i = r(c, s, e)) > 0 ? i = r(c = Math.floor(c / i) * i, s = Math.ceil(s / i) * i, e) : i < 0 && (i = r(c = Math.ceil(c * i) / i, s = Math.floor(s * i) / i, e)),
                    i > 0 ? (o[u] = Math.floor(c / i) * i,
                        o[a] = Math.ceil(s / i) * i,
                        n(o)) : i < 0 && (o[u] = Math.ceil(c * i) / i,
                        o[a] = Math.floor(s * i) / i,
                        n(o)),
                    t
            }
            ,
            t
    }
    function lu() {
        var t = su(ru, ol);
        return t.copy = function() {
            return cu(t, lu())
        }
            ,
            fu(t)
    }
    function hu() {
        function t(t) {
            return +t
        }
        var n = [0, 1];
        return t.invert = t,
            t.domain = t.range = function(e) {
                return arguments.length ? (n = E_.call(e, P_),
                    t) : n.slice()
            }
            ,
            t.copy = function() {
                return hu().domain(n)
            }
            ,
            fu(t)
    }
    function pu(t, n) {
        return (n = Math.log(n / t)) ? function(e) {
                return Math.log(e / t) / n
            }
            : z_(n)
    }
    function du(t, n) {
        return t < 0 ? function(e) {
                return -Math.pow(-n, e) * Math.pow(-t, 1 - e)
            }
            : function(e) {
                return Math.pow(n, e) * Math.pow(t, 1 - e)
            }
    }
    function vu(t) {
        return isFinite(t) ? +("1e" + t) : t < 0 ? 0 : t
    }
    function _u(t) {
        return 10 === t ? vu : t === Math.E ? Math.exp : function(n) {
            return Math.pow(t, n)
        }
    }
    function gu(t) {
        return t === Math.E ? Math.log : 10 === t && Math.log10 || 2 === t && Math.log2 || (t = Math.log(t),
                function(n) {
                    return Math.log(n) / t
                }
        )
    }
    function yu(t) {
        return function(n) {
            return -t(-n)
        }
    }
    function mu() {
        function n() {
            return o = gu(i),
                u = _u(i),
            r()[0] < 0 && (o = yu(o),
                u = yu(u)),
                e
        }
        var e = su(pu, du).domain([1, 10])
            , r = e.domain
            , i = 10
            , o = gu(10)
            , u = _u(10);
        return e.base = function(t) {
            return arguments.length ? (i = +t,
                n()) : i
        }
            ,
            e.domain = function(t) {
                return arguments.length ? (r(t),
                    n()) : r()
            }
            ,
            e.ticks = function(t) {
                var n, e = r(), a = e[0], c = e[e.length - 1];
                (n = c < a) && (h = a,
                    a = c,
                    c = h);
                var s, f, l, h = o(a), p = o(c), d = null == t ? 10 : +t, v = [];
                if (!(i % 1) && p - h < d) {
                    if (h = Math.round(h) - 1,
                            p = Math.round(p) + 1,
                        a > 0) {
                        for (; h < p; ++h)
                            for (f = 1,
                                     s = u(h); f < i; ++f)
                                if (!((l = s * f) < a)) {
                                    if (l > c)
                                        break;
                                    v.push(l)
                                }
                    } else
                        for (; h < p; ++h)
                            for (f = i - 1,
                                     s = u(h); f >= 1; --f)
                                if (!((l = s * f) < a)) {
                                    if (l > c)
                                        break;
                                    v.push(l)
                                }
                } else
                    v = As(h, p, Math.min(p - h, d)).map(u);
                return n ? v.reverse() : v
            }
            ,
            e.tickFormat = function(n, r) {
                if (null == r && (r = 10 === i ? ".0e" : ","),
                    "function" != typeof r && (r = t.format(r)),
                    n === 1 / 0)
                    return r;
                null == n && (n = 10);
                var a = Math.max(1, i * n / e.ticks().length);
                return function(t) {
                    var n = t / u(Math.round(o(t)));
                    return n * i < i - .5 && (n *= i),
                        n <= a ? r(t) : ""
                }
            }
            ,
            e.nice = function() {
                return r(q_(r(), {
                    floor: function(t) {
                        return u(Math.floor(o(t)))
                    },
                    ceil: function(t) {
                        return u(Math.ceil(o(t)))
                    }
                }))
            }
            ,
            e.copy = function() {
                return cu(e, mu().base(i))
            }
            ,
            e
    }
    function xu(t, n) {
        return t < 0 ? -Math.pow(-t, n) : Math.pow(t, n)
    }
    function bu() {
        var t = 1
            , n = su(function(n, e) {
            return (e = xu(e, t) - (n = xu(n, t))) ? function(r) {
                    return (xu(r, t) - n) / e
                }
                : z_(e)
        }, function(n, e) {
            return e = xu(e, t) - (n = xu(n, t)),
                function(r) {
                    return xu(n + e * r, 1 / t)
                }
        })
            , e = n.domain;
        return n.exponent = function(n) {
            return arguments.length ? (t = +n,
                e(e())) : t
        }
            ,
            n.copy = function() {
                return cu(n, bu().exponent(t))
            }
            ,
            fu(n)
    }
    function wu() {
        function t() {
            var t = 0
                , o = Math.max(1, r.length);
            for (i = new Array(o - 1); ++t < o; )
                i[t - 1] = zs(e, t / o);
            return n
        }
        function n(t) {
            if (!isNaN(t = +t))
                return r[ds(i, t)]
        }
        var e = []
            , r = []
            , i = [];
        return n.invertExtent = function(t) {
            var n = r.indexOf(t);
            return n < 0 ? [NaN, NaN] : [n > 0 ? i[n - 1] : e[0], n < i.length ? i[n] : e[e.length - 1]]
        }
            ,
            n.domain = function(n) {
                if (!arguments.length)
                    return e.slice();
                e = [];
                for (var r, i = 0, o = n.length; i < o; ++i)
                    null == (r = n[i]) || isNaN(r = +r) || e.push(r);
                return e.sort(ls),
                    t()
            }
            ,
            n.range = function(n) {
                return arguments.length ? (r = A_.call(n),
                    t()) : r.slice()
            }
            ,
            n.quantiles = function() {
                return i.slice()
            }
            ,
            n.copy = function() {
                return wu().domain(e).range(r)
            }
            ,
            n
    }
    function Mu() {
        function t(t) {
            if (t <= t)
                return u[ds(o, t, 0, i)]
        }
        function n() {
            var n = -1;
            for (o = new Array(i); ++n < i; )
                o[n] = ((n + 1) * r - (n - i) * e) / (i + 1);
            return t
        }
        var e = 0
            , r = 1
            , i = 1
            , o = [.5]
            , u = [0, 1];
        return t.domain = function(t) {
            return arguments.length ? (e = +t[0],
                r = +t[1],
                n()) : [e, r]
        }
            ,
            t.range = function(t) {
                return arguments.length ? (i = (u = A_.call(t)).length - 1,
                    n()) : u.slice()
            }
            ,
            t.invertExtent = function(t) {
                var n = u.indexOf(t);
                return n < 0 ? [NaN, NaN] : n < 1 ? [e, o[0]] : n >= i ? [o[i - 1], r] : [o[n - 1], o[n]]
            }
            ,
            t.copy = function() {
                return Mu().domain([e, r]).range(u)
            }
            ,
            fu(t)
    }
    function Tu() {
        function t(t) {
            if (t <= t)
                return e[ds(n, t, 0, r)]
        }
        var n = [.5]
            , e = [0, 1]
            , r = 1;
        return t.domain = function(i) {
            return arguments.length ? (n = A_.call(i),
                r = Math.min(n.length, e.length - 1),
                t) : n.slice()
        }
            ,
            t.range = function(i) {
                return arguments.length ? (e = A_.call(i),
                    r = Math.min(n.length, e.length - 1),
                    t) : e.slice()
            }
            ,
            t.invertExtent = function(t) {
                var r = e.indexOf(t);
                return [n[r - 1], n[r]]
            }
            ,
            t.copy = function() {
                return Tu().domain(n).range(e)
            }
            ,
            t
    }
    function Nu(t, n, e, r) {
        function i(n) {
            return t(n = new Date(+n)),
                n
        }
        return i.floor = i,
            i.ceil = function(e) {
                return t(e = new Date(e - 1)),
                    n(e, 1),
                    t(e),
                    e
            }
            ,
            i.round = function(t) {
                var n = i(t)
                    , e = i.ceil(t);
                return t - n < e - t ? n : e
            }
            ,
            i.offset = function(t, e) {
                return n(t = new Date(+t), null == e ? 1 : Math.floor(e)),
                    t
            }
            ,
            i.range = function(e, r, o) {
                var u = [];
                if (e = i.ceil(e),
                        o = null == o ? 1 : Math.floor(o),
                        !(e < r && o > 0))
                    return u;
                do {
                    u.push(new Date(+e))
                } while (n(e, o),
                    t(e),
                e < r);return u
            }
            ,
            i.filter = function(e) {
                return Nu(function(n) {
                    if (n >= n)
                        for (; t(n),
                                   !e(n); )
                            n.setTime(n - 1)
                }, function(t, r) {
                    if (t >= t)
                        if (r < 0)
                            for (; ++r <= 0; )
                                for (; n(t, -1),
                                           !e(t); )
                                    ;
                        else
                            for (; --r >= 0; )
                                for (; n(t, 1),
                                           !e(t); )
                                    ;
                })
            }
            ,
        e && (i.count = function(n, r) {
                return U_.setTime(+n),
                    D_.setTime(+r),
                    t(U_),
                    t(D_),
                    Math.floor(e(U_, D_))
            }
                ,
                i.every = function(t) {
                    return t = Math.floor(t),
                        isFinite(t) && t > 0 ? t > 1 ? i.filter(r ? function(n) {
                                return r(n) % t == 0
                            }
                            : function(n) {
                                return i.count(0, n) % t == 0
                            }
                        ) : i : null
                }
        ),
            i
    }
    function ku(t) {
        return Nu(function(n) {
            n.setDate(n.getDate() - (n.getDay() + 7 - t) % 7),
                n.setHours(0, 0, 0, 0)
        }, function(t, n) {
            t.setDate(t.getDate() + 7 * n)
        }, function(t, n) {
            return (n - t - (n.getTimezoneOffset() - t.getTimezoneOffset()) * I_) / Y_
        })
    }
    function Su(t) {
        return Nu(function(n) {
            n.setUTCDate(n.getUTCDate() - (n.getUTCDay() + 7 - t) % 7),
                n.setUTCHours(0, 0, 0, 0)
        }, function(t, n) {
            t.setUTCDate(t.getUTCDate() + 7 * n)
        }, function(t, n) {
            return (n - t) / Y_
        })
    }
    function Eu(t) {
        if (0 <= t.y && t.y < 100) {
            var n = new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);
            return n.setFullYear(t.y),
                n
        }
        return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)
    }
    function Au(t) {
        if (0 <= t.y && t.y < 100) {
            var n = new Date(Date.UTC(-1, t.m, t.d, t.H, t.M, t.S, t.L));
            return n.setUTCFullYear(t.y),
                n
        }
        return new Date(Date.UTC(t.y, t.m, t.d, t.H, t.M, t.S, t.L))
    }
    function Cu(t) {
        return {
            y: t,
            m: 0,
            d: 1,
            H: 0,
            M: 0,
            S: 0,
            L: 0
        }
    }
    function zu(t) {
        function n(t, n) {
            return function(e) {
                var r, i, o, u = [], a = -1, c = 0, s = t.length;
                for (e instanceof Date || (e = new Date(+e)); ++a < s; )
                    37 === t.charCodeAt(a) && (u.push(t.slice(c, a)),
                        null != (i = Fg[r = t.charAt(++a)]) ? r = t.charAt(++a) : i = "e" === r ? " " : "0",
                    (o = n[r]) && (r = o(e, i)),
                        u.push(r),
                        c = a + 1);
                return u.push(t.slice(c, a)),
                    u.join("")
            }
        }
        function e(t, n) {
            return function(e) {
                var i = Cu(1900);
                if (r(i, t, e += "", 0) != e.length)
                    return null;
                if ("p"in i && (i.H = i.H % 12 + 12 * i.p),
                    "W"in i || "U"in i) {
                    "w"in i || (i.w = "W"in i ? 1 : 0);
                    var o = "Z"in i ? Au(Cu(i.y)).getUTCDay() : n(Cu(i.y)).getDay();
                    i.m = 0,
                        i.d = "W"in i ? (i.w + 6) % 7 + 7 * i.W - (o + 5) % 7 : i.w + 7 * i.U - (o + 6) % 7
                }
                return "Z"in i ? (i.H += i.Z / 100 | 0,
                    i.M += i.Z % 100,
                    Au(i)) : n(i)
            }
        }
        function r(t, n, e, r) {
            for (var i, o, u = 0, a = n.length, c = e.length; u < a; ) {
                if (r >= c)
                    return -1;
                if (37 === (i = n.charCodeAt(u++))) {
                    if (i = n.charAt(u++),
                        !(o = T[i in Fg ? n.charAt(u++) : i]) || (r = o(t, e, r)) < 0)
                        return -1
                } else if (i != e.charCodeAt(r++))
                    return -1
            }
            return r
        }
        var i = t.dateTime
            , o = t.date
            , u = t.time
            , a = t.periods
            , c = t.days
            , s = t.shortDays
            , f = t.months
            , l = t.shortMonths
            , h = Lu(a)
            , p = qu(a)
            , d = Lu(c)
            , v = qu(c)
            , _ = Lu(s)
            , g = qu(s)
            , y = Lu(f)
            , m = qu(f)
            , x = Lu(l)
            , b = qu(l)
            , w = {
            a: function(t) {
                return s[t.getDay()]
            },
            A: function(t) {
                return c[t.getDay()]
            },
            b: function(t) {
                return l[t.getMonth()]
            },
            B: function(t) {
                return f[t.getMonth()]
            },
            c: null,
            d: Gu,
            e: Gu,
            H: Ju,
            I: Qu,
            j: Ku,
            L: ta,
            m: na,
            M: ea,
            p: function(t) {
                return a[+(t.getHours() >= 12)]
            },
            S: ra,
            U: ia,
            w: oa,
            W: ua,
            x: null,
            X: null,
            y: aa,
            Y: ca,
            Z: sa,
            "%": Ta
        }
            , M = {
            a: function(t) {
                return s[t.getUTCDay()]
            },
            A: function(t) {
                return c[t.getUTCDay()]
            },
            b: function(t) {
                return l[t.getUTCMonth()]
            },
            B: function(t) {
                return f[t.getUTCMonth()]
            },
            c: null,
            d: fa,
            e: fa,
            H: la,
            I: ha,
            j: pa,
            L: da,
            m: va,
            M: _a,
            p: function(t) {
                return a[+(t.getUTCHours() >= 12)]
            },
            S: ga,
            U: ya,
            w: ma,
            W: xa,
            x: null,
            X: null,
            y: ba,
            Y: wa,
            Z: Ma,
            "%": Ta
        }
            , T = {
            a: function(t, n, e) {
                var r = _.exec(n.slice(e));
                return r ? (t.w = g[r[0].toLowerCase()],
                e + r[0].length) : -1
            },
            A: function(t, n, e) {
                var r = d.exec(n.slice(e));
                return r ? (t.w = v[r[0].toLowerCase()],
                e + r[0].length) : -1
            },
            b: function(t, n, e) {
                var r = x.exec(n.slice(e));
                return r ? (t.m = b[r[0].toLowerCase()],
                e + r[0].length) : -1
            },
            B: function(t, n, e) {
                var r = y.exec(n.slice(e));
                return r ? (t.m = m[r[0].toLowerCase()],
                e + r[0].length) : -1
            },
            c: function(t, n, e) {
                return r(t, i, n, e)
            },
            d: ju,
            e: ju,
            H: Xu,
            I: Xu,
            j: Hu,
            L: Wu,
            m: Bu,
            M: $u,
            p: function(t, n, e) {
                var r = h.exec(n.slice(e));
                return r ? (t.p = p[r[0].toLowerCase()],
                e + r[0].length) : -1
            },
            S: Vu,
            U: Du,
            w: Uu,
            W: Ou,
            x: function(t, n, e) {
                return r(t, o, n, e)
            },
            X: function(t, n, e) {
                return r(t, u, n, e)
            },
            y: Iu,
            Y: Fu,
            Z: Yu,
            "%": Zu
        };
        return w.x = n(o, w),
            w.X = n(u, w),
            w.c = n(i, w),
            M.x = n(o, M),
            M.X = n(u, M),
            M.c = n(i, M),
            {
                format: function(t) {
                    var e = n(t += "", w);
                    return e.toString = function() {
                        return t
                    }
                        ,
                        e
                },
                parse: function(t) {
                    var n = e(t += "", Eu);
                    return n.toString = function() {
                        return t
                    }
                        ,
                        n
                },
                utcFormat: function(t) {
                    var e = n(t += "", M);
                    return e.toString = function() {
                        return t
                    }
                        ,
                        e
                },
                utcParse: function(t) {
                    var n = e(t, Au);
                    return n.toString = function() {
                        return t
                    }
                        ,
                        n
                }
            }
    }
    function Pu(t, n, e) {
        var r = t < 0 ? "-" : ""
            , i = (r ? -t : t) + ""
            , o = i.length;
        return r + (o < e ? new Array(e - o + 1).join(n) + i : i)
    }
    function Ru(t) {
        return t.replace(Bg, "\\$&")
    }
    function Lu(t) {
        return new RegExp("^(?:" + t.map(Ru).join("|") + ")","i")
    }
    function qu(t) {
        for (var n = {}, e = -1, r = t.length; ++e < r; )
            n[t[e].toLowerCase()] = e;
        return n
    }
    function Uu(t, n, e) {
        var r = Ig.exec(n.slice(e, e + 1));
        return r ? (t.w = +r[0],
        e + r[0].length) : -1
    }
    function Du(t, n, e) {
        var r = Ig.exec(n.slice(e));
        return r ? (t.U = +r[0],
        e + r[0].length) : -1
    }
    function Ou(t, n, e) {
        var r = Ig.exec(n.slice(e));
        return r ? (t.W = +r[0],
        e + r[0].length) : -1
    }
    function Fu(t, n, e) {
        var r = Ig.exec(n.slice(e, e + 4));
        return r ? (t.y = +r[0],
        e + r[0].length) : -1
    }
    function Iu(t, n, e) {
        var r = Ig.exec(n.slice(e, e + 2));
        return r ? (t.y = +r[0] + (+r[0] > 68 ? 1900 : 2e3),
        e + r[0].length) : -1
    }
    function Yu(t, n, e) {
        var r = /^(Z)|([+-]\d\d)(?:\:?(\d\d))?/.exec(n.slice(e, e + 6));
        return r ? (t.Z = r[1] ? 0 : -(r[2] + (r[3] || "00")),
        e + r[0].length) : -1
    }
    function Bu(t, n, e) {
        var r = Ig.exec(n.slice(e, e + 2));
        return r ? (t.m = r[0] - 1,
        e + r[0].length) : -1
    }
    function ju(t, n, e) {
        var r = Ig.exec(n.slice(e, e + 2));
        return r ? (t.d = +r[0],
        e + r[0].length) : -1
    }
    function Hu(t, n, e) {
        var r = Ig.exec(n.slice(e, e + 3));
        return r ? (t.m = 0,
            t.d = +r[0],
        e + r[0].length) : -1
    }
    function Xu(t, n, e) {
        var r = Ig.exec(n.slice(e, e + 2));
        return r ? (t.H = +r[0],
        e + r[0].length) : -1
    }
    function $u(t, n, e) {
        var r = Ig.exec(n.slice(e, e + 2));
        return r ? (t.M = +r[0],
        e + r[0].length) : -1
    }
    function Vu(t, n, e) {
        var r = Ig.exec(n.slice(e, e + 2));
        return r ? (t.S = +r[0],
        e + r[0].length) : -1
    }
    function Wu(t, n, e) {
        var r = Ig.exec(n.slice(e, e + 3));
        return r ? (t.L = +r[0],
        e + r[0].length) : -1
    }
    function Zu(t, n, e) {
        var r = Yg.exec(n.slice(e, e + 1));
        return r ? e + r[0].length : -1
    }
    function Gu(t, n) {
        return Pu(t.getDate(), n, 2)
    }
    function Ju(t, n) {
        return Pu(t.getHours(), n, 2)
    }
    function Qu(t, n) {
        return Pu(t.getHours() % 12 || 12, n, 2)
    }
    function Ku(t, n) {
        return Pu(1 + W_.count(hg(t), t), n, 3)
    }
    function ta(t, n) {
        return Pu(t.getMilliseconds(), n, 3)
    }
    function na(t, n) {
        return Pu(t.getMonth() + 1, n, 2)
    }
    function ea(t, n) {
        return Pu(t.getMinutes(), n, 2)
    }
    function ra(t, n) {
        return Pu(t.getSeconds(), n, 2)
    }
    function ia(t, n) {
        return Pu(G_.count(hg(t), t), n, 2)
    }
    function oa(t) {
        return t.getDay()
    }
    function ua(t, n) {
        return Pu(J_.count(hg(t), t), n, 2)
    }
    function aa(t, n) {
        return Pu(t.getFullYear() % 100, n, 2)
    }
    function ca(t, n) {
        return Pu(t.getFullYear() % 1e4, n, 4)
    }
    function sa(t) {
        var n = t.getTimezoneOffset();
        return (n > 0 ? "-" : (n *= -1,
            "+")) + Pu(n / 60 | 0, "0", 2) + Pu(n % 60, "0", 2)
    }
    function fa(t, n) {
        return Pu(t.getUTCDate(), n, 2)
    }
    function la(t, n) {
        return Pu(t.getUTCHours(), n, 2)
    }
    function ha(t, n) {
        return Pu(t.getUTCHours() % 12 || 12, n, 2)
    }
    function pa(t, n) {
        return Pu(1 + yg.count(Ug(t), t), n, 3)
    }
    function da(t, n) {
        return Pu(t.getUTCMilliseconds(), n, 3)
    }
    function va(t, n) {
        return Pu(t.getUTCMonth() + 1, n, 2)
    }
    function _a(t, n) {
        return Pu(t.getUTCMinutes(), n, 2)
    }
    function ga(t, n) {
        return Pu(t.getUTCSeconds(), n, 2)
    }
    function ya(t, n) {
        return Pu(xg.count(Ug(t), t), n, 2)
    }
    function ma(t) {
        return t.getUTCDay()
    }
    function xa(t, n) {
        return Pu(bg.count(Ug(t), t), n, 2)
    }
    function ba(t, n) {
        return Pu(t.getUTCFullYear() % 100, n, 2)
    }
    function wa(t, n) {
        return Pu(t.getUTCFullYear() % 1e4, n, 4)
    }
    function Ma() {
        return "+0000"
    }
    function Ta() {
        return "%"
    }
    function Na(n) {
        return Dg = zu(n),
            t.timeFormat = Dg.format,
            t.timeParse = Dg.parse,
            t.utcFormat = Dg.utcFormat,
            t.utcParse = Dg.utcParse,
            Dg
    }
    function ka(t) {
        return new Date(t)
    }
    function Sa(t) {
        return t instanceof Date ? +t : +new Date(+t)
    }
    function Ea(t, n, e, r, o, u, a, c, s) {
        function f(i) {
            return (a(i) < i ? v : u(i) < i ? _ : o(i) < i ? g : r(i) < i ? y : n(i) < i ? e(i) < i ? m : x : t(i) < i ? b : w)(i)
        }
        function l(n, e, r, o) {
            if (null == n && (n = 10),
                "number" == typeof n) {
                var u = Math.abs(r - e) / n
                    , a = hs(function(t) {
                    return t[2]
                }).right(M, u);
                a === M.length ? (o = i(e / Jg, r / Jg, n),
                    n = t) : a ? (o = (a = M[u / M[a - 1][2] < M[a][2] / u ? a - 1 : a])[1],
                    n = a[0]) : (o = i(e, r, n),
                    n = c)
            }
            return null == o ? n : n.every(o)
        }
        var h = su(ru, ol)
            , p = h.invert
            , d = h.domain
            , v = s(".%L")
            , _ = s(":%S")
            , g = s("%I:%M")
            , y = s("%I %p")
            , m = s("%a %d")
            , x = s("%b %d")
            , b = s("%B")
            , w = s("%Y")
            , M = [[a, 1, Xg], [a, 5, 5 * Xg], [a, 15, 15 * Xg], [a, 30, 30 * Xg], [u, 1, $g], [u, 5, 5 * $g], [u, 15, 15 * $g], [u, 30, 30 * $g], [o, 1, Vg], [o, 3, 3 * Vg], [o, 6, 6 * Vg], [o, 12, 12 * Vg], [r, 1, Wg], [r, 2, 2 * Wg], [e, 1, Zg], [n, 1, Gg], [n, 3, 3 * Gg], [t, 1, Jg]];
        return h.invert = function(t) {
            return new Date(p(t))
        }
            ,
            h.domain = function(t) {
                return arguments.length ? d(E_.call(t, Sa)) : d().map(ka)
            }
            ,
            h.ticks = function(t, n) {
                var e, r = d(), i = r[0], o = r[r.length - 1], u = o < i;
                return u && (e = i,
                    i = o,
                    o = e),
                    e = l(t, i, o, n),
                    e = e ? e.range(i, o + 1) : [],
                    u ? e.reverse() : e
            }
            ,
            h.tickFormat = function(t, n) {
                return null == n ? f : s(n)
            }
            ,
            h.nice = function(t, n) {
                var e = d();
                return (t = l(t, e[0], e[e.length - 1], n)) ? d(q_(e, t)) : h
            }
            ,
            h.copy = function() {
                return cu(h, Ea(t, n, e, r, o, u, a, c, s))
            }
            ,
            h
    }
    function Aa(t) {
        var n = t.length;
        return function(e) {
            return t[Math.max(0, Math.min(n - 1, Math.floor(e * n)))]
        }
    }
    function Ca(t) {
        function n(n) {
            var o = (n - e) / (r - e);
            return t(i ? Math.max(0, Math.min(1, o)) : o)
        }
        var e = 0
            , r = 1
            , i = !1;
        return n.domain = function(t) {
            return arguments.length ? (e = +t[0],
                r = +t[1],
                n) : [e, r]
        }
            ,
            n.clamp = function(t) {
                return arguments.length ? (i = !!t,
                    n) : i
            }
            ,
            n.interpolator = function(e) {
                return arguments.length ? (t = e,
                    n) : t
            }
            ,
            n.copy = function() {
                return Ca(t).domain([e, r]).clamp(i)
            }
            ,
            fu(n)
    }
    function za(t) {
        return t > 1 ? 0 : t < -1 ? xy : Math.acos(t)
    }
    function Pa(t) {
        return t >= 1 ? by : t <= -1 ? -by : Math.asin(t)
    }
    function Ra(t) {
        return t.innerRadius
    }
    function La(t) {
        return t.outerRadius
    }
    function qa(t) {
        return t.startAngle
    }
    function Ua(t) {
        return t.endAngle
    }
    function Da(t) {
        return t && t.padAngle
    }
    function Oa(t, n, e, r, i, o, u, a) {
        var c = e - t
            , s = r - n
            , f = u - i
            , l = a - o
            , h = (f * (n - o) - l * (t - i)) / (l * c - f * s);
        return [t + h * c, n + h * s]
    }
    function Fa(t, n, e, r, i, o, u) {
        var a = t - e
            , c = n - r
            , s = (u ? o : -o) / yy(a * a + c * c)
            , f = s * c
            , l = -s * a
            , h = t + f
            , p = n + l
            , d = e + f
            , v = r + l
            , _ = (h + d) / 2
            , g = (p + v) / 2
            , y = d - h
            , m = v - p
            , x = y * y + m * m
            , b = i - o
            , w = h * v - d * p
            , M = (m < 0 ? -1 : 1) * yy(vy(0, b * b * x - w * w))
            , T = (w * m - y * M) / x
            , N = (-w * y - m * M) / x
            , k = (w * m + y * M) / x
            , S = (-w * y + m * M) / x
            , E = T - _
            , A = N - g
            , C = k - _
            , z = S - g;
        return E * E + A * A > C * C + z * z && (T = k,
            N = S),
            {
                cx: T,
                cy: N,
                x01: -f,
                y01: -l,
                x11: T * (i / b - 1),
                y11: N * (i / b - 1)
            }
    }
    function Ia(t) {
        this._context = t
    }
    function Ya(t) {
        return t[0]
    }
    function Ba(t) {
        return t[1]
    }
    function ja(t) {
        this._curve = t
    }
    function Ha(t) {
        function n(n) {
            return new ja(t(n))
        }
        return n._curve = t,
            n
    }
    function Xa(t) {
        var n = t.curve;
        return t.angle = t.x,
            delete t.x,
            t.radius = t.y,
            delete t.y,
            t.curve = function(t) {
                return arguments.length ? n(Ha(t)) : n()._curve
            }
            ,
            t
    }
    function $a(t) {
        return t.source
    }
    function Va(t) {
        return t.target
    }
    function Wa(t) {
        function n() {
            var n, a = Py.call(arguments), c = e.apply(this, a), s = r.apply(this, a);
            if (u || (u = n = ve()),
                    t(u, +i.apply(this, (a[0] = c,
                        a)), +o.apply(this, a), +i.apply(this, (a[0] = s,
                        a)), +o.apply(this, a)),
                    n)
                return u = null,
                n + "" || null
        }
        var e = $a
            , r = Va
            , i = Ya
            , o = Ba
            , u = null;
        return n.source = function(t) {
            return arguments.length ? (e = t,
                n) : e
        }
            ,
            n.target = function(t) {
                return arguments.length ? (r = t,
                    n) : r
            }
            ,
            n.x = function(t) {
                return arguments.length ? (i = "function" == typeof t ? t : ly(+t),
                    n) : i
            }
            ,
            n.y = function(t) {
                return arguments.length ? (o = "function" == typeof t ? t : ly(+t),
                    n) : o
            }
            ,
            n.context = function(t) {
                return arguments.length ? (u = null == t ? null : t,
                    n) : u
            }
            ,
            n
    }
    function Za(t, n, e, r, i) {
        t.moveTo(n, e),
            t.bezierCurveTo(n = (n + r) / 2, e, n, i, r, i)
    }
    function Ga(t, n, e, r, i) {
        t.moveTo(n, e),
            t.bezierCurveTo(n, e = (e + i) / 2, r, e, r, i)
    }
    function Ja(t, n, e, r, i) {
        var o = zy(n, e)
            , u = zy(n, e = (e + i) / 2)
            , a = zy(r, e)
            , c = zy(r, i);
        t.moveTo(o[0], o[1]),
            t.bezierCurveTo(u[0], u[1], a[0], a[1], c[0], c[1])
    }
    function Qa(t, n, e) {
        t._context.bezierCurveTo((2 * t._x0 + t._x1) / 3, (2 * t._y0 + t._y1) / 3, (t._x0 + 2 * t._x1) / 3, (t._y0 + 2 * t._y1) / 3, (t._x0 + 4 * t._x1 + n) / 6, (t._y0 + 4 * t._y1 + e) / 6)
    }
    function Ka(t) {
        this._context = t
    }
    function tc(t) {
        this._context = t
    }
    function nc(t) {
        this._context = t
    }
    function ec(t, n) {
        this._basis = new Ka(t),
            this._beta = n
    }
    function rc(t, n, e) {
        t._context.bezierCurveTo(t._x1 + t._k * (t._x2 - t._x0), t._y1 + t._k * (t._y2 - t._y0), t._x2 + t._k * (t._x1 - n), t._y2 + t._k * (t._y1 - e), t._x2, t._y2)
    }
    function ic(t, n) {
        this._context = t,
            this._k = (1 - n) / 6
    }
    function oc(t, n) {
        this._context = t,
            this._k = (1 - n) / 6
    }
    function uc(t, n) {
        this._context = t,
            this._k = (1 - n) / 6
    }
    function ac(t, n, e) {
        var r = t._x1
            , i = t._y1
            , o = t._x2
            , u = t._y2;
        if (t._l01_a > my) {
            var a = 2 * t._l01_2a + 3 * t._l01_a * t._l12_a + t._l12_2a
                , c = 3 * t._l01_a * (t._l01_a + t._l12_a);
            r = (r * a - t._x0 * t._l12_2a + t._x2 * t._l01_2a) / c,
                i = (i * a - t._y0 * t._l12_2a + t._y2 * t._l01_2a) / c
        }
        if (t._l23_a > my) {
            var s = 2 * t._l23_2a + 3 * t._l23_a * t._l12_a + t._l12_2a
                , f = 3 * t._l23_a * (t._l23_a + t._l12_a);
            o = (o * s + t._x1 * t._l23_2a - n * t._l12_2a) / f,
                u = (u * s + t._y1 * t._l23_2a - e * t._l12_2a) / f
        }
        t._context.bezierCurveTo(r, i, o, u, t._x2, t._y2)
    }
    function cc(t, n) {
        this._context = t,
            this._alpha = n
    }
    function sc(t, n) {
        this._context = t,
            this._alpha = n
    }
    function fc(t, n) {
        this._context = t,
            this._alpha = n
    }
    function lc(t) {
        this._context = t
    }
    function hc(t) {
        return t < 0 ? -1 : 1
    }
    function pc(t, n, e) {
        var r = t._x1 - t._x0
            , i = n - t._x1
            , o = (t._y1 - t._y0) / (r || i < 0 && -0)
            , u = (e - t._y1) / (i || r < 0 && -0)
            , a = (o * i + u * r) / (r + i);
        return (hc(o) + hc(u)) * Math.min(Math.abs(o), Math.abs(u), .5 * Math.abs(a)) || 0
    }
    function dc(t, n) {
        var e = t._x1 - t._x0;
        return e ? (3 * (t._y1 - t._y0) / e - n) / 2 : n
    }
    function vc(t, n, e) {
        var r = t._x0
            , i = t._y0
            , o = t._x1
            , u = t._y1
            , a = (o - r) / 3;
        t._context.bezierCurveTo(r + a, i + a * n, o - a, u - a * e, o, u)
    }
    function _c(t) {
        this._context = t
    }
    function gc(t) {
        this._context = new yc(t)
    }
    function yc(t) {
        this._context = t
    }
    function mc(t) {
        this._context = t
    }
    function xc(t) {
        var n, e, r = t.length - 1, i = new Array(r), o = new Array(r), u = new Array(r);
        for (i[0] = 0,
                 o[0] = 2,
                 u[0] = t[0] + 2 * t[1],
                 n = 1; n < r - 1; ++n)
            i[n] = 1,
                o[n] = 4,
                u[n] = 4 * t[n] + 2 * t[n + 1];
        for (i[r - 1] = 2,
                 o[r - 1] = 7,
                 u[r - 1] = 8 * t[r - 1] + t[r],
                 n = 1; n < r; ++n)
            e = i[n] / o[n - 1],
                o[n] -= e,
                u[n] -= e * u[n - 1];
        for (i[r - 1] = u[r - 1] / o[r - 1],
                 n = r - 2; n >= 0; --n)
            i[n] = (u[n] - i[n + 1]) / o[n];
        for (o[r - 1] = (t[r] + i[r - 1]) / 2,
                 n = 0; n < r - 1; ++n)
            o[n] = 2 * t[n + 1] - i[n + 1];
        return [i, o]
    }
    function bc(t, n) {
        this._context = t,
            this._t = n
    }
    function wc(t, n) {
        return t[n]
    }
    function Mc(t) {
        for (var n, e = 0, r = -1, i = t.length; ++r < i; )
            (n = +t[r][1]) && (e += n);
        return e
    }
    function Tc(t) {
        return t[0]
    }
    function Nc(t) {
        return t[1]
    }
    function kc() {
        this._ = null
    }
    function Sc(t) {
        t.U = t.C = t.L = t.R = t.P = t.N = null
    }
    function Ec(t, n) {
        var e = n
            , r = n.R
            , i = e.U;
        i ? i.L === e ? i.L = r : i.R = r : t._ = r,
            r.U = i,
            e.U = r,
            e.R = r.L,
        e.R && (e.R.U = e),
            r.L = e
    }
    function Ac(t, n) {
        var e = n
            , r = n.L
            , i = e.U;
        i ? i.L === e ? i.L = r : i.R = r : t._ = r,
            r.U = i,
            e.U = r,
            e.L = r.R,
        e.L && (e.L.U = e),
            r.R = e
    }
    function Cc(t) {
        for (; t.L; )
            t = t.L;
        return t
    }
    function zc(t, n, e, r) {
        var i = [null, null]
            , o = pm.push(i) - 1;
        return i.left = t,
            i.right = n,
        e && Rc(i, t, n, e),
        r && Rc(i, n, t, r),
            lm[t.index].halfedges.push(o),
            lm[n.index].halfedges.push(o),
            i
    }
    function Pc(t, n, e) {
        var r = [n, e];
        return r.left = t,
            r
    }
    function Rc(t, n, e, r) {
        t[0] || t[1] ? t.left === e ? t[1] = r : t[0] = r : (t[0] = r,
            t.left = n,
            t.right = e)
    }
    function Lc(t, n, e, r, i) {
        var o, u = t[0], a = t[1], c = u[0], s = u[1], f = 0, l = 1, h = a[0] - c, p = a[1] - s;
        if (o = n - c,
            h || !(o > 0)) {
            if (o /= h,
                h < 0) {
                if (o < f)
                    return;
                o < l && (l = o)
            } else if (h > 0) {
                if (o > l)
                    return;
                o > f && (f = o)
            }
            if (o = r - c,
                h || !(o < 0)) {
                if (o /= h,
                    h < 0) {
                    if (o > l)
                        return;
                    o > f && (f = o)
                } else if (h > 0) {
                    if (o < f)
                        return;
                    o < l && (l = o)
                }
                if (o = e - s,
                    p || !(o > 0)) {
                    if (o /= p,
                        p < 0) {
                        if (o < f)
                            return;
                        o < l && (l = o)
                    } else if (p > 0) {
                        if (o > l)
                            return;
                        o > f && (f = o)
                    }
                    if (o = i - s,
                        p || !(o < 0)) {
                        if (o /= p,
                            p < 0) {
                            if (o > l)
                                return;
                            o > f && (f = o)
                        } else if (p > 0) {
                            if (o < f)
                                return;
                            o < l && (l = o)
                        }
                        return !(f > 0 || l < 1) || (f > 0 && (t[0] = [c + f * h, s + f * p]),
                        l < 1 && (t[1] = [c + l * h, s + l * p]),
                            !0)
                    }
                }
            }
        }
    }
    function qc(t, n, e, r, i) {
        var o = t[1];
        if (o)
            return !0;
        var u, a, c = t[0], s = t.left, f = t.right, l = s[0], h = s[1], p = f[0], d = f[1], v = (l + p) / 2, _ = (h + d) / 2;
        if (d === h) {
            if (v < n || v >= r)
                return;
            if (l > p) {
                if (c) {
                    if (c[1] >= i)
                        return
                } else
                    c = [v, e];
                o = [v, i]
            } else {
                if (c) {
                    if (c[1] < e)
                        return
                } else
                    c = [v, i];
                o = [v, e]
            }
        } else if (u = (l - p) / (d - h),
                a = _ - u * v,
            u < -1 || u > 1)
            if (l > p) {
                if (c) {
                    if (c[1] >= i)
                        return
                } else
                    c = [(e - a) / u, e];
                o = [(i - a) / u, i]
            } else {
                if (c) {
                    if (c[1] < e)
                        return
                } else
                    c = [(i - a) / u, i];
                o = [(e - a) / u, e]
            }
        else if (h < d) {
            if (c) {
                if (c[0] >= r)
                    return
            } else
                c = [n, u * n + a];
            o = [r, u * r + a]
        } else {
            if (c) {
                if (c[0] < n)
                    return
            } else
                c = [r, u * r + a];
            o = [n, u * n + a]
        }
        return t[0] = c,
            t[1] = o,
            !0
    }
    function Uc(t, n, e, r) {
        for (var i, o = pm.length; o--; )
            qc(i = pm[o], t, n, e, r) && Lc(i, t, n, e, r) && (Math.abs(i[0][0] - i[1][0]) > _m || Math.abs(i[0][1] - i[1][1]) > _m) || delete pm[o]
    }
    function Dc(t) {
        return lm[t.index] = {
            site: t,
            halfedges: []
        }
    }
    function Oc(t, n) {
        var e = t.site
            , r = n.left
            , i = n.right;
        return e === i && (i = r,
            r = e),
            i ? Math.atan2(i[1] - r[1], i[0] - r[0]) : (e === r ? (r = n[1],
                i = n[0]) : (r = n[0],
                i = n[1]),
                Math.atan2(r[0] - i[0], i[1] - r[1]))
    }
    function Fc(t, n) {
        return n[+(n.left !== t.site)]
    }
    function Ic(t, n) {
        return n[+(n.left === t.site)]
    }
    function Yc() {
        for (var t, n, e, r, i = 0, o = lm.length; i < o; ++i)
            if ((t = lm[i]) && (r = (n = t.halfedges).length)) {
                var u = new Array(r)
                    , a = new Array(r);
                for (e = 0; e < r; ++e)
                    u[e] = e,
                        a[e] = Oc(t, pm[n[e]]);
                for (u.sort(function(t, n) {
                    return a[n] - a[t]
                }),
                         e = 0; e < r; ++e)
                    a[e] = n[u[e]];
                for (e = 0; e < r; ++e)
                    n[e] = a[e]
            }
    }
    function Bc(t, n, e, r) {
        var i, o, u, a, c, s, f, l, h, p, d, v, _ = lm.length, g = !0;
        for (i = 0; i < _; ++i)
            if (o = lm[i]) {
                for (u = o.site,
                         a = (c = o.halfedges).length; a--; )
                    pm[c[a]] || c.splice(a, 1);
                for (a = 0,
                         s = c.length; a < s; )
                    d = (p = Ic(o, pm[c[a]]))[0],
                        v = p[1],
                        l = (f = Fc(o, pm[c[++a % s]]))[0],
                        h = f[1],
                    (Math.abs(d - l) > _m || Math.abs(v - h) > _m) && (c.splice(a, 0, pm.push(Pc(u, p, Math.abs(d - t) < _m && r - v > _m ? [t, Math.abs(l - t) < _m ? h : r] : Math.abs(v - r) < _m && e - d > _m ? [Math.abs(h - r) < _m ? l : e, r] : Math.abs(d - e) < _m && v - n > _m ? [e, Math.abs(l - e) < _m ? h : n] : Math.abs(v - n) < _m && d - t > _m ? [Math.abs(h - n) < _m ? l : t, n] : null)) - 1),
                        ++s);
                s && (g = !1)
            }
        if (g) {
            var y, m, x, b = 1 / 0;
            for (i = 0,
                     g = null; i < _; ++i)
                (o = lm[i]) && (x = (y = (u = o.site)[0] - t) * y + (m = u[1] - n) * m) < b && (b = x,
                    g = o);
            if (g) {
                var w = [t, n]
                    , M = [t, r]
                    , T = [e, r]
                    , N = [e, n];
                g.halfedges.push(pm.push(Pc(u = g.site, w, M)) - 1, pm.push(Pc(u, M, T)) - 1, pm.push(Pc(u, T, N)) - 1, pm.push(Pc(u, N, w)) - 1)
            }
        }
        for (i = 0; i < _; ++i)
            (o = lm[i]) && (o.halfedges.length || delete lm[i])
    }
    function jc() {
        Sc(this),
            this.x = this.y = this.arc = this.site = this.cy = null
    }
    function Hc(t) {
        var n = t.P
            , e = t.N;
        if (n && e) {
            var r = n.site
                , i = t.site
                , o = e.site;
            if (r !== o) {
                var u = i[0]
                    , a = i[1]
                    , c = r[0] - u
                    , s = r[1] - a
                    , f = o[0] - u
                    , l = o[1] - a
                    , h = 2 * (c * l - s * f);
                if (!(h >= -gm)) {
                    var p = c * c + s * s
                        , d = f * f + l * l
                        , v = (l * p - s * d) / h
                        , _ = (c * d - f * p) / h
                        , g = dm.pop() || new jc;
                    g.arc = t,
                        g.site = i,
                        g.x = v + u,
                        g.y = (g.cy = _ + a) + Math.sqrt(v * v + _ * _),
                        t.circle = g;
                    for (var y = null, m = hm._; m; )
                        if (g.y < m.y || g.y === m.y && g.x <= m.x) {
                            if (!m.L) {
                                y = m.P;
                                break
                            }
                            m = m.L
                        } else {
                            if (!m.R) {
                                y = m;
                                break
                            }
                            m = m.R
                        }
                    hm.insert(y, g),
                    y || (sm = g)
                }
            }
        }
    }
    function Xc(t) {
        var n = t.circle;
        n && (n.P || (sm = n.N),
            hm.remove(n),
            dm.push(n),
            Sc(n),
            t.circle = null)
    }
    function $c() {
        Sc(this),
            this.edge = this.site = this.circle = null
    }
    function Vc(t) {
        var n = vm.pop() || new $c;
        return n.site = t,
            n
    }
    function Wc(t) {
        Xc(t),
            fm.remove(t),
            vm.push(t),
            Sc(t)
    }
    function Zc(t) {
        var n = t.circle
            , e = n.x
            , r = n.cy
            , i = [e, r]
            , o = t.P
            , u = t.N
            , a = [t];
        Wc(t);
        for (var c = o; c.circle && Math.abs(e - c.circle.x) < _m && Math.abs(r - c.circle.cy) < _m; )
            o = c.P,
                a.unshift(c),
                Wc(c),
                c = o;
        a.unshift(c),
            Xc(c);
        for (var s = u; s.circle && Math.abs(e - s.circle.x) < _m && Math.abs(r - s.circle.cy) < _m; )
            u = s.N,
                a.push(s),
                Wc(s),
                s = u;
        a.push(s),
            Xc(s);
        var f, l = a.length;
        for (f = 1; f < l; ++f)
            s = a[f],
                c = a[f - 1],
                Rc(s.edge, c.site, s.site, i);
        c = a[0],
            (s = a[l - 1]).edge = zc(c.site, s.site, null, i),
            Hc(c),
            Hc(s)
    }
    function Gc(t) {
        for (var n, e, r, i, o = t[0], u = t[1], a = fm._; a; )
            if ((r = Jc(a, u) - o) > _m)
                a = a.L;
            else {
                if (!((i = o - Qc(a, u)) > _m)) {
                    r > -_m ? (n = a.P,
                        e = a) : i > -_m ? (n = a,
                        e = a.N) : n = e = a;
                    break
                }
                if (!a.R) {
                    n = a;
                    break
                }
                a = a.R
            }
        Dc(t);
        var c = Vc(t);
        if (fm.insert(n, c),
            n || e) {
            if (n === e)
                return Xc(n),
                    e = Vc(n.site),
                    fm.insert(c, e),
                    c.edge = e.edge = zc(n.site, c.site),
                    Hc(n),
                    void Hc(e);
            if (e) {
                Xc(n),
                    Xc(e);
                var s = n.site
                    , f = s[0]
                    , l = s[1]
                    , h = t[0] - f
                    , p = t[1] - l
                    , d = e.site
                    , v = d[0] - f
                    , _ = d[1] - l
                    , g = 2 * (h * _ - p * v)
                    , y = h * h + p * p
                    , m = v * v + _ * _
                    , x = [(_ * y - p * m) / g + f, (h * m - v * y) / g + l];
                Rc(e.edge, s, d, x),
                    c.edge = zc(s, t, null, x),
                    e.edge = zc(t, d, null, x),
                    Hc(n),
                    Hc(e)
            } else
                c.edge = zc(n.site, c.site)
        }
    }
    function Jc(t, n) {
        var e = t.site
            , r = e[0]
            , i = e[1]
            , o = i - n;
        if (!o)
            return r;
        var u = t.P;
        if (!u)
            return -1 / 0;
        var a = (e = u.site)[0]
            , c = e[1]
            , s = c - n;
        if (!s)
            return a;
        var f = a - r
            , l = 1 / o - 1 / s
            , h = f / s;
        return l ? (-h + Math.sqrt(h * h - 2 * l * (f * f / (-2 * s) - c + s / 2 + i - o / 2))) / l + r : (r + a) / 2
    }
    function Qc(t, n) {
        var e = t.N;
        if (e)
            return Jc(e, n);
        var r = t.site;
        return r[1] === n ? r[0] : 1 / 0
    }
    function Kc(t, n, e) {
        return (t[0] - e[0]) * (n[1] - t[1]) - (t[0] - n[0]) * (e[1] - t[1])
    }
    function ts(t, n) {
        return n[1] - t[1] || n[0] - t[0]
    }
    function ns(t, n) {
        var e, r, i, o = t.sort(ts).pop();
        for (pm = [],
                 lm = new Array(t.length),
                 fm = new kc,
                 hm = new kc; ; )
            if (i = sm,
                o && (!i || o[1] < i.y || o[1] === i.y && o[0] < i.x))
                o[0] === e && o[1] === r || (Gc(o),
                    e = o[0],
                    r = o[1]),
                    o = t.pop();
            else {
                if (!i)
                    break;
                Zc(i.arc)
            }
        if (Yc(),
                n) {
            var u = +n[0][0]
                , a = +n[0][1]
                , c = +n[1][0]
                , s = +n[1][1];
            Uc(u, a, c, s),
                Bc(u, a, c, s)
        }
        this.edges = pm,
            this.cells = lm,
            fm = hm = pm = lm = null
    }
    function es(t, n, e) {
        this.target = t,
            this.type = n,
            this.transform = e
    }
    function rs(t, n, e) {
        this.k = t,
            this.x = n,
            this.y = e
    }
    function is(t) {
        return t.__zoom || mm
    }
    function os() {
        t.event.stopImmediatePropagation()
    }
    function us() {
        return !t.event.button
    }
    function as() {
        var t, n, e = this;
        return e instanceof SVGElement ? (t = (e = e.ownerSVGElement || e).width.baseVal.value,
            n = e.height.baseVal.value) : (t = e.clientWidth,
            n = e.clientHeight),
            [[0, 0], [t, n]]
    }
    function cs() {
        return this.__zoom || mm
    }
    function ss() {
        return -t.event.deltaY * (t.event.deltaMode ? 120 : 1) / 500
    }
    function fs() {
        return "ontouchstart"in this
    }
    var ls = function(t, n) {
        return t < n ? -1 : t > n ? 1 : t >= n ? 0 : NaN
    }
        , hs = function(t) {
        return 1 === t.length && (t = n(t)),
            {
                left: function(n, e, r, i) {
                    for (null == r && (r = 0),
                         null == i && (i = n.length); r < i; ) {
                        var o = r + i >>> 1;
                        t(n[o], e) < 0 ? r = o + 1 : i = o
                    }
                    return r
                },
                right: function(n, e, r, i) {
                    for (null == r && (r = 0),
                         null == i && (i = n.length); r < i; ) {
                        var o = r + i >>> 1;
                        t(n[o], e) > 0 ? i = o : r = o + 1
                    }
                    return r
                }
            }
    }
        , ps = hs(ls)
        , ds = ps.right
        , vs = ps.left
        , _s = function(t) {
        return null === t ? NaN : +t
    }
        , gs = function(t, n) {
        var e, r, i = t.length, o = 0, u = -1, a = 0, c = 0;
        if (null == n)
            for (; ++u < i; )
                isNaN(e = _s(t[u])) || (c += (r = e - a) * (e - (a += r / ++o)));
        else
            for (; ++u < i; )
                isNaN(e = _s(n(t[u], u, t))) || (c += (r = e - a) * (e - (a += r / ++o)));
        if (o > 1)
            return c / (o - 1)
    }
        , ys = function(t, n) {
        var e = gs(t, n);
        return e ? Math.sqrt(e) : e
    }
        , ms = function(t, n) {
        var e, r, i, o = t.length, u = -1;
        if (null == n) {
            for (; ++u < o; )
                if (null != (e = t[u]) && e >= e)
                    for (r = i = e; ++u < o; )
                        null != (e = t[u]) && (r > e && (r = e),
                        i < e && (i = e))
        } else
            for (; ++u < o; )
                if (null != (e = n(t[u], u, t)) && e >= e)
                    for (r = i = e; ++u < o; )
                        null != (e = n(t[u], u, t)) && (r > e && (r = e),
                        i < e && (i = e));
        return [r, i]
    }
        , xs = Array.prototype
        , bs = xs.slice
        , ws = xs.map
        , Ms = function(t) {
        return function() {
            return t
        }
    }
        , Ts = function(t) {
        return t
    }
        , Ns = function(t, n, e) {
        t = +t,
            n = +n,
            e = (i = arguments.length) < 2 ? (n = t,
                t = 0,
                1) : i < 3 ? 1 : +e;
        for (var r = -1, i = 0 | Math.max(0, Math.ceil((n - t) / e)), o = new Array(i); ++r < i; )
            o[r] = t + r * e;
        return o
    }
        , ks = Math.sqrt(50)
        , Ss = Math.sqrt(10)
        , Es = Math.sqrt(2)
        , As = function(t, n, e) {
        var i, o, u, a, c = -1;
        if (n = +n,
                t = +t,
                e = +e,
            t === n && e > 0)
            return [t];
        if ((i = n < t) && (o = t,
                t = n,
                n = o),
            0 === (a = r(t, n, e)) || !isFinite(a))
            return [];
        if (a > 0)
            for (t = Math.ceil(t / a),
                     n = Math.floor(n / a),
                     u = new Array(o = Math.ceil(n - t + 1)); ++c < o; )
                u[c] = (t + c) * a;
        else
            for (t = Math.floor(t * a),
                     n = Math.ceil(n * a),
                     u = new Array(o = Math.ceil(t - n + 1)); ++c < o; )
                u[c] = (t - c) / a;
        return i && u.reverse(),
            u
    }
        , Cs = function(t) {
        return Math.ceil(Math.log(t.length) / Math.LN2) + 1
    }
        , zs = function(t, n, e) {
        if (null == e && (e = _s),
                r = t.length) {
            if ((n = +n) <= 0 || r < 2)
                return +e(t[0], 0, t);
            if (n >= 1)
                return +e(t[r - 1], r - 1, t);
            var r, i = (r - 1) * n, o = Math.floor(i), u = +e(t[o], o, t);
            return u + (+e(t[o + 1], o + 1, t) - u) * (i - o)
        }
    }
        , Ps = function(t) {
        for (var n, e, r, i = t.length, o = -1, u = 0; ++o < i; )
            u += t[o].length;
        for (e = new Array(u); --i >= 0; )
            for (n = (r = t[i]).length; --n >= 0; )
                e[--u] = r[n];
        return e
    }
        , Rs = function(t, n) {
        var e, r, i = t.length, o = -1;
        if (null == n) {
            for (; ++o < i; )
                if (null != (e = t[o]) && e >= e)
                    for (r = e; ++o < i; )
                        null != (e = t[o]) && r > e && (r = e)
        } else
            for (; ++o < i; )
                if (null != (e = n(t[o], o, t)) && e >= e)
                    for (r = e; ++o < i; )
                        null != (e = n(t[o], o, t)) && r > e && (r = e);
        return r
    }
        , Ls = function(t) {
        if (!(i = t.length))
            return [];
        for (var n = -1, e = Rs(t, o), r = new Array(e); ++n < e; )
            for (var i, u = -1, a = r[n] = new Array(i); ++u < i; )
                a[u] = t[u][n];
        return r
    }
        , qs = Array.prototype.slice
        , Us = function(t) {
        return t
    }
        , Ds = 1
        , Os = 2
        , Fs = 3
        , Is = 4
        , Ys = 1e-6
        , Bs = {
        value: function() {}
    };
    p.prototype = h.prototype = {
        constructor: p,
        on: function(t, n) {
            var e, r = this._, i = d(t + "", r), o = -1, u = i.length;
            {
                if (!(arguments.length < 2)) {
                    if (null != n && "function" != typeof n)
                        throw new Error("invalid callback: " + n);
                    for (; ++o < u; )
                        if (e = (t = i[o]).type)
                            r[e] = _(r[e], t.name, n);
                        else if (null == n)
                            for (e in r)
                                r[e] = _(r[e], t.name, null);
                    return this
                }
                for (; ++o < u; )
                    if ((e = (t = i[o]).type) && (e = v(r[e], t.name)))
                        return e
            }
        },
        copy: function() {
            var t = {}
                , n = this._;
            for (var e in n)
                t[e] = n[e].slice();
            return new p(t)
        },
        call: function(t, n) {
            if ((e = arguments.length - 2) > 0)
                for (var e, r, i = new Array(e), o = 0; o < e; ++o)
                    i[o] = arguments[o + 2];
            if (!this._.hasOwnProperty(t))
                throw new Error("unknown type: " + t);
            for (o = 0,
                     e = (r = this._[t]).length; o < e; ++o)
                r[o].value.apply(n, i)
        },
        apply: function(t, n, e) {
            if (!this._.hasOwnProperty(t))
                throw new Error("unknown type: " + t);
            for (var r = this._[t], i = 0, o = r.length; i < o; ++i)
                r[i].value.apply(n, e)
        }
    };
    var js = "http://www.w3.org/1999/xhtml"
        , Hs = {
        svg: "http://www.w3.org/2000/svg",
        xhtml: js,
        xlink: "http://www.w3.org/1999/xlink",
        xml: "http://www.w3.org/XML/1998/namespace",
        xmlns: "http://www.w3.org/2000/xmlns/"
    }
        , Xs = function(t) {
        var n = t += ""
            , e = n.indexOf(":");
        return e >= 0 && "xmlns" !== (n = t.slice(0, e)) && (t = t.slice(e + 1)),
            Hs.hasOwnProperty(n) ? {
                space: Hs[n],
                local: t
            } : t
    }
        , $s = function(t) {
        var n = Xs(t);
        return (n.local ? y : g)(n)
    }
        , Vs = 0;
    x.prototype = m.prototype = {
        constructor: x,
        get: function(t) {
            for (var n = this._; !(n in t); )
                if (!(t = t.parentNode))
                    return;
            return t[n]
        },
        set: function(t, n) {
            return t[this._] = n
        },
        remove: function(t) {
            return this._ in t && delete t[this._]
        },
        toString: function() {
            return this._
        }
    };
    var Ws = function(t) {
        return function() {
            return this.matches(t)
        }
    };
    if ("undefined" != typeof document) {
        var Zs = document.documentElement;
        if (!Zs.matches) {
            var Gs = Zs.webkitMatchesSelector || Zs.msMatchesSelector || Zs.mozMatchesSelector || Zs.oMatchesSelector;
            Ws = function(t) {
                return function() {
                    return Gs.call(this, t)
                }
            }
        }
    }
    var Js = Ws
        , Qs = {};
    t.event = null,
    "undefined" != typeof document && ("onmouseenter"in document.documentElement || (Qs = {
        mouseenter: "mouseover",
        mouseleave: "mouseout"
    }));
    var Ks = function() {
        for (var n, e = t.event; n = e.sourceEvent; )
            e = n;
        return e
    }
        , tf = function(t, n) {
        var e = t.ownerSVGElement || t;
        if (e.createSVGPoint) {
            var r = e.createSVGPoint();
            return r.x = n.clientX,
                r.y = n.clientY,
                r = r.matrixTransform(t.getScreenCTM().inverse()),
                [r.x, r.y]
        }
        var i = t.getBoundingClientRect();
        return [n.clientX - i.left - t.clientLeft, n.clientY - i.top - t.clientTop]
    }
        , nf = function(t) {
        var n = Ks();
        return n.changedTouches && (n = n.changedTouches[0]),
            tf(t, n)
    }
        , ef = function(t) {
        return null == t ? S : function() {
            return this.querySelector(t)
        }
    }
        , rf = function(t) {
        return null == t ? E : function() {
            return this.querySelectorAll(t)
        }
    }
        , of = function(t) {
        return new Array(t.length)
    };
    A.prototype = {
        constructor: A,
        appendChild: function(t) {
            return this._parent.insertBefore(t, this._next)
        },
        insertBefore: function(t, n) {
            return this._parent.insertBefore(t, n)
        },
        querySelector: function(t) {
            return this._parent.querySelector(t)
        },
        querySelectorAll: function(t) {
            return this._parent.querySelectorAll(t)
        }
    };
    var uf = function(t) {
        return function() {
            return t
        }
    }
        , af = "$"
        , cf = function(t) {
        return t.ownerDocument && t.ownerDocument.defaultView || t.document && t || t.defaultView
    };
    W.prototype = {
        add: function(t) {
            this._names.indexOf(t) < 0 && (this._names.push(t),
                this._node.setAttribute("class", this._names.join(" ")))
        },
        remove: function(t) {
            var n = this._names.indexOf(t);
            n >= 0 && (this._names.splice(n, 1),
                this._node.setAttribute("class", this._names.join(" ")))
        },
        contains: function(t) {
            return this._names.indexOf(t) >= 0
        }
    };
    var sf = [null];
    pt.prototype = dt.prototype = {
        constructor: pt,
        select: function(t) {
            "function" != typeof t && (t = ef(t));
            for (var n = this._groups, e = n.length, r = new Array(e), i = 0; i < e; ++i)
                for (var o, u, a = n[i], c = a.length, s = r[i] = new Array(c), f = 0; f < c; ++f)
                    (o = a[f]) && (u = t.call(o, o.__data__, f, a)) && ("__data__"in o && (u.__data__ = o.__data__),
                        s[f] = u);
            return new pt(r,this._parents)
        },
        selectAll: function(t) {
            "function" != typeof t && (t = rf(t));
            for (var n = this._groups, e = n.length, r = [], i = [], o = 0; o < e; ++o)
                for (var u, a = n[o], c = a.length, s = 0; s < c; ++s)
                    (u = a[s]) && (r.push(t.call(u, u.__data__, s, a)),
                        i.push(u));
            return new pt(r,i)
        },
        filter: function(t) {
            "function" != typeof t && (t = Js(t));
            for (var n = this._groups, e = n.length, r = new Array(e), i = 0; i < e; ++i)
                for (var o, u = n[i], a = u.length, c = r[i] = [], s = 0; s < a; ++s)
                    (o = u[s]) && t.call(o, o.__data__, s, u) && c.push(o);
            return new pt(r,this._parents)
        },
        data: function(t, n) {
            if (!t)
                return p = new Array(this.size()),
                    s = -1,
                    this.each(function(t) {
                        p[++s] = t
                    }),
                    p;
            var e = n ? z : C
                , r = this._parents
                , i = this._groups;
            "function" != typeof t && (t = uf(t));
            for (var o = i.length, u = new Array(o), a = new Array(o), c = new Array(o), s = 0; s < o; ++s) {
                var f = r[s]
                    , l = i[s]
                    , h = l.length
                    , p = t.call(f, f && f.__data__, s, r)
                    , d = p.length
                    , v = a[s] = new Array(d)
                    , _ = u[s] = new Array(d);
                e(f, l, v, _, c[s] = new Array(h), p, n);
                for (var g, y, m = 0, x = 0; m < d; ++m)
                    if (g = v[m]) {
                        for (m >= x && (x = m + 1); !(y = _[x]) && ++x < d; )
                            ;
                        g._next = y || null
                    }
            }
            return u = new pt(u,r),
                u._enter = a,
                u._exit = c,
                u
        },
        enter: function() {
            return new pt(this._enter || this._groups.map(of),this._parents)
        },
        exit: function() {
            return new pt(this._exit || this._groups.map(of),this._parents)
        },
        merge: function(t) {
            for (var n = this._groups, e = t._groups, r = n.length, i = e.length, o = Math.min(r, i), u = new Array(r), a = 0; a < o; ++a)
                for (var c, s = n[a], f = e[a], l = s.length, h = u[a] = new Array(l), p = 0; p < l; ++p)
                    (c = s[p] || f[p]) && (h[p] = c);
            for (; a < r; ++a)
                u[a] = n[a];
            return new pt(u,this._parents)
        },
        order: function() {
            for (var t = this._groups, n = -1, e = t.length; ++n < e; )
                for (var r, i = t[n], o = i.length - 1, u = i[o]; --o >= 0; )
                    (r = i[o]) && (u && u !== r.nextSibling && u.parentNode.insertBefore(r, u),
                        u = r);
            return this
        },
        sort: function(t) {
            t || (t = P);
            for (var n = this._groups, e = n.length, r = new Array(e), i = 0; i < e; ++i) {
                for (var o, u = n[i], a = u.length, c = r[i] = new Array(a), s = 0; s < a; ++s)
                    (o = u[s]) && (c[s] = o);
                c.sort(function(n, e) {
                    return n && e ? t(n.__data__, e.__data__) : !n - !e
                })
            }
            return new pt(r,this._parents).order()
        },
        call: function() {
            var t = arguments[0];
            return arguments[0] = this,
                t.apply(null, arguments),
                this
        },
        nodes: function() {
            var t = new Array(this.size())
                , n = -1;
            return this.each(function() {
                t[++n] = this
            }),
                t
        },
        node: function() {
            for (var t = this._groups, n = 0, e = t.length; n < e; ++n)
                for (var r = t[n], i = 0, o = r.length; i < o; ++i) {
                    var u = r[i];
                    if (u)
                        return u
                }
            return null
        },
        size: function() {
            var t = 0;
            return this.each(function() {
                ++t
            }),
                t
        },
        empty: function() {
            return !this.node()
        },
        each: function(t) {
            for (var n = this._groups, e = 0, r = n.length; e < r; ++e)
                for (var i, o = n[e], u = 0, a = o.length; u < a; ++u)
                    (i = o[u]) && t.call(i, i.__data__, u, o);
            return this
        },
        attr: function(t, n) {
            var e = Xs(t);
            if (arguments.length < 2) {
                var r = this.node();
                return e.local ? r.getAttributeNS(e.space, e.local) : r.getAttribute(e)
            }
            return this.each((null == n ? e.local ? L : R : "function" == typeof n ? e.local ? O : D : e.local ? U : q)(e, n))
        },
        style: function(t, n, e) {
            return arguments.length > 1 ? this.each((null == n ? F : "function" == typeof n ? Y : I)(t, n, null == e ? "" : e)) : B(this.node(), t)
        },
        property: function(t, n) {
            return arguments.length > 1 ? this.each((null == n ? j : "function" == typeof n ? X : H)(t, n)) : this.node()[t]
        },
        classed: function(t, n) {
            var e = $(t + "");
            if (arguments.length < 2) {
                for (var r = V(this.node()), i = -1, o = e.length; ++i < o; )
                    if (!r.contains(e[i]))
                        return !1;
                return !0
            }
            return this.each(("function" == typeof n ? K : n ? J : Q)(e, n))
        },
        text: function(t) {
            return arguments.length ? this.each(null == t ? tt : ("function" == typeof t ? et : nt)(t)) : this.node().textContent
        },
        html: function(t) {
            return arguments.length ? this.each(null == t ? rt : ("function" == typeof t ? ot : it)(t)) : this.node().innerHTML
        },
        raise: function() {
            return this.each(ut)
        },
        lower: function() {
            return this.each(at)
        },
        append: function(t) {
            var n = "function" == typeof t ? t : $s(t);
            return this.select(function() {
                return this.appendChild(n.apply(this, arguments))
            })
        },
        insert: function(t, n) {
            var e = "function" == typeof t ? t : $s(t)
                , r = null == n ? ct : "function" == typeof n ? n : ef(n);
            return this.select(function() {
                return this.insertBefore(e.apply(this, arguments), r.apply(this, arguments) || null)
            })
        },
        remove: function() {
            return this.each(st)
        },
        datum: function(t) {
            return arguments.length ? this.property("__data__", t) : this.node().__data__
        },
        on: function(t, n, e) {
            var r, i, o = M(t + ""), u = o.length;
            {
                if (!(arguments.length < 2)) {
                    for (a = n ? N : T,
                         null == e && (e = !1),
                             r = 0; r < u; ++r)
                        this.each(a(o[r], n, e));
                    return this
                }
                var a = this.node().__on;
                if (a)
                    for (var c, s = 0, f = a.length; s < f; ++s)
                        for (r = 0,
                                 c = a[s]; r < u; ++r)
                            if ((i = o[r]).type === c.type && i.name === c.name)
                                return c.value
            }
        },
        dispatch: function(t, n) {
            return this.each(("function" == typeof n ? ht : lt)(t, n))
        }
    };
    var ff = function(t) {
        return "string" == typeof t ? new pt([[document.querySelector(t)]],[document.documentElement]) : new pt([[t]],sf)
    }
        , lf = function(t, n, e) {
        arguments.length < 3 && (e = n,
            n = Ks().changedTouches);
        for (var r, i = 0, o = n ? n.length : 0; i < o; ++i)
            if ((r = n[i]).identifier === e)
                return tf(t, r);
        return null
    }
        , hf = function() {
        t.event.preventDefault(),
            t.event.stopImmediatePropagation()
    }
        , pf = function(t) {
        var n = t.document.documentElement
            , e = ff(t).on("dragstart.drag", hf, !0);
        "onselectstart"in n ? e.on("selectstart.drag", hf, !0) : (n.__noselect = n.style.MozUserSelect,
            n.style.MozUserSelect = "none")
    }
        , df = function(t) {
        return function() {
            return t
        }
    };
    gt.prototype.on = function() {
        var t = this._.on.apply(this._, arguments);
        return t === this._ ? this : t
    }
    ;
    var vf = function(t, n, e) {
        t.prototype = n.prototype = e,
            e.constructor = t
    }
        , _f = "\\s*([+-]?\\d+)\\s*"
        , gf = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*"
        , yf = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*"
        , mf = /^#([0-9a-f]{3})$/
        , xf = /^#([0-9a-f]{6})$/
        , bf = new RegExp("^rgb\\(" + [_f, _f, _f] + "\\)$")
        , wf = new RegExp("^rgb\\(" + [yf, yf, yf] + "\\)$")
        , Mf = new RegExp("^rgba\\(" + [_f, _f, _f, gf] + "\\)$")
        , Tf = new RegExp("^rgba\\(" + [yf, yf, yf, gf] + "\\)$")
        , Nf = new RegExp("^hsl\\(" + [gf, yf, yf] + "\\)$")
        , kf = new RegExp("^hsla\\(" + [gf, yf, yf, gf] + "\\)$")
        , Sf = {
        aliceblue: 15792383,
        antiquewhite: 16444375,
        aqua: 65535,
        aquamarine: 8388564,
        azure: 15794175,
        beige: 16119260,
        bisque: 16770244,
        black: 0,
        blanchedalmond: 16772045,
        blue: 255,
        blueviolet: 9055202,
        brown: 10824234,
        burlywood: 14596231,
        cadetblue: 6266528,
        chartreuse: 8388352,
        chocolate: 13789470,
        coral: 16744272,
        cornflowerblue: 6591981,
        cornsilk: 16775388,
        crimson: 14423100,
        cyan: 65535,
        darkblue: 139,
        darkcyan: 35723,
        darkgoldenrod: 12092939,
        darkgray: 11119017,
        darkgreen: 25600,
        darkgrey: 11119017,
        darkkhaki: 12433259,
        darkmagenta: 9109643,
        darkolivegreen: 5597999,
        darkorange: 16747520,
        darkorchid: 10040012,
        darkred: 9109504,
        darksalmon: 15308410,
        darkseagreen: 9419919,
        darkslateblue: 4734347,
        darkslategray: 3100495,
        darkslategrey: 3100495,
        darkturquoise: 52945,
        darkviolet: 9699539,
        deeppink: 16716947,
        deepskyblue: 49151,
        dimgray: 6908265,
        dimgrey: 6908265,
        dodgerblue: 2003199,
        firebrick: 11674146,
        floralwhite: 16775920,
        forestgreen: 2263842,
        fuchsia: 16711935,
        gainsboro: 14474460,
        ghostwhite: 16316671,
        gold: 16766720,
        goldenrod: 14329120,
        gray: 8421504,
        green: 32768,
        greenyellow: 11403055,
        grey: 8421504,
        honeydew: 15794160,
        hotpink: 16738740,
        indianred: 13458524,
        indigo: 4915330,
        ivory: 16777200,
        khaki: 15787660,
        lavender: 15132410,
        lavenderblush: 16773365,
        lawngreen: 8190976,
        lemonchiffon: 16775885,
        lightblue: 11393254,
        lightcoral: 15761536,
        lightcyan: 14745599,
        lightgoldenrodyellow: 16448210,
        lightgray: 13882323,
        lightgreen: 9498256,
        lightgrey: 13882323,
        lightpink: 16758465,
        lightsalmon: 16752762,
        lightseagreen: 2142890,
        lightskyblue: 8900346,
        lightslategray: 7833753,
        lightslategrey: 7833753,
        lightsteelblue: 11584734,
        lightyellow: 16777184,
        lime: 65280,
        limegreen: 3329330,
        linen: 16445670,
        magenta: 16711935,
        maroon: 8388608,
        mediumaquamarine: 6737322,
        mediumblue: 205,
        mediumorchid: 12211667,
        mediumpurple: 9662683,
        mediumseagreen: 3978097,
        mediumslateblue: 8087790,
        mediumspringgreen: 64154,
        mediumturquoise: 4772300,
        mediumvioletred: 13047173,
        midnightblue: 1644912,
        mintcream: 16121850,
        mistyrose: 16770273,
        moccasin: 16770229,
        navajowhite: 16768685,
        navy: 128,
        oldlace: 16643558,
        olive: 8421376,
        olivedrab: 7048739,
        orange: 16753920,
        orangered: 16729344,
        orchid: 14315734,
        palegoldenrod: 15657130,
        palegreen: 10025880,
        paleturquoise: 11529966,
        palevioletred: 14381203,
        papayawhip: 16773077,
        peachpuff: 16767673,
        peru: 13468991,
        pink: 16761035,
        plum: 14524637,
        powderblue: 11591910,
        purple: 8388736,
        rebeccapurple: 6697881,
        red: 16711680,
        rosybrown: 12357519,
        royalblue: 4286945,
        saddlebrown: 9127187,
        salmon: 16416882,
        sandybrown: 16032864,
        seagreen: 3050327,
        seashell: 16774638,
        sienna: 10506797,
        silver: 12632256,
        skyblue: 8900331,
        slateblue: 6970061,
        slategray: 7372944,
        slategrey: 7372944,
        snow: 16775930,
        springgreen: 65407,
        steelblue: 4620980,
        tan: 13808780,
        teal: 32896,
        thistle: 14204888,
        tomato: 16737095,
        turquoise: 4251856,
        violet: 15631086,
        wheat: 16113331,
        white: 16777215,
        whitesmoke: 16119285,
        yellow: 16776960,
        yellowgreen: 10145074
    };
    vf(Mt, Tt, {
        displayable: function() {
            return this.rgb().displayable()
        },
        toString: function() {
            return this.rgb() + ""
        }
    }),
        vf(At, Et, wt(Mt, {
            brighter: function(t) {
                return t = null == t ? 1 / .7 : Math.pow(1 / .7, t),
                    new At(this.r * t,this.g * t,this.b * t,this.opacity)
            },
            darker: function(t) {
                return t = null == t ? .7 : Math.pow(.7, t),
                    new At(this.r * t,this.g * t,this.b * t,this.opacity)
            },
            rgb: function() {
                return this
            },
            displayable: function() {
                return 0 <= this.r && this.r <= 255 && 0 <= this.g && this.g <= 255 && 0 <= this.b && this.b <= 255 && 0 <= this.opacity && this.opacity <= 1
            },
            toString: function() {
                var t = this.opacity;
                return (1 === (t = isNaN(t) ? 1 : Math.max(0, Math.min(1, t))) ? "rgb(" : "rgba(") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (1 === t ? ")" : ", " + t + ")")
            }
        })),
        vf(Rt, Pt, wt(Mt, {
            brighter: function(t) {
                return t = null == t ? 1 / .7 : Math.pow(1 / .7, t),
                    new Rt(this.h,this.s,this.l * t,this.opacity)
            },
            darker: function(t) {
                return t = null == t ? .7 : Math.pow(.7, t),
                    new Rt(this.h,this.s,this.l * t,this.opacity)
            },
            rgb: function() {
                var t = this.h % 360 + 360 * (this.h < 0)
                    , n = isNaN(t) || isNaN(this.s) ? 0 : this.s
                    , e = this.l
                    , r = e + (e < .5 ? e : 1 - e) * n
                    , i = 2 * e - r;
                return new At(Lt(t >= 240 ? t - 240 : t + 120, i, r),Lt(t, i, r),Lt(t < 120 ? t + 240 : t - 120, i, r),this.opacity)
            },
            displayable: function() {
                return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1
            }
        }));
    var Ef = Math.PI / 180
        , Af = 180 / Math.PI
        , Cf = .95047
        , zf = 1
        , Pf = 1.08883
        , Rf = 4 / 29
        , Lf = 6 / 29
        , qf = 3 * Lf * Lf
        , Uf = Lf * Lf * Lf;
    vf(Dt, Ut, wt(Mt, {
        brighter: function(t) {
            return new Dt(this.l + 18 * (null == t ? 1 : t),this.a,this.b,this.opacity)
        },
        darker: function(t) {
            return new Dt(this.l - 18 * (null == t ? 1 : t),this.a,this.b,this.opacity)
        },
        rgb: function() {
            var t = (this.l + 16) / 116
                , n = isNaN(this.a) ? t : t + this.a / 500
                , e = isNaN(this.b) ? t : t - this.b / 200;
            return t = zf * Ft(t),
                n = Cf * Ft(n),
                e = Pf * Ft(e),
                new At(It(3.2404542 * n - 1.5371385 * t - .4985314 * e),It(-.969266 * n + 1.8760108 * t + .041556 * e),It(.0556434 * n - .2040259 * t + 1.0572252 * e),this.opacity)
        }
    })),
        vf(Ht, jt, wt(Mt, {
            brighter: function(t) {
                return new Ht(this.h,this.c,this.l + 18 * (null == t ? 1 : t),this.opacity)
            },
            darker: function(t) {
                return new Ht(this.h,this.c,this.l - 18 * (null == t ? 1 : t),this.opacity)
            },
            rgb: function() {
                return qt(this).rgb()
            }
        }));
    var Df = -.14861
        , Of = 1.78277
        , Ff = -.29227
        , If = -.90649
        , Yf = 1.97294
        , Bf = Yf * If
        , jf = Yf * Of
        , Hf = Of * Ff - If * Df;
    vf(Vt, $t, wt(Mt, {
        brighter: function(t) {
            return t = null == t ? 1 / .7 : Math.pow(1 / .7, t),
                new Vt(this.h,this.s,this.l * t,this.opacity)
        },
        darker: function(t) {
            return t = null == t ? .7 : Math.pow(.7, t),
                new Vt(this.h,this.s,this.l * t,this.opacity)
        },
        rgb: function() {
            var t = isNaN(this.h) ? 0 : (this.h + 120) * Ef
                , n = +this.l
                , e = isNaN(this.s) ? 0 : this.s * n * (1 - n)
                , r = Math.cos(t)
                , i = Math.sin(t);
            return new At(255 * (n + e * (Df * r + Of * i)),255 * (n + e * (Ff * r + If * i)),255 * (n + e * (Yf * r)),this.opacity)
        }
    }));
    var Xf, $f, Vf, Wf, Zf, Gf, Jf = function(t) {
            var n = t.length - 1;
            return function(e) {
                var r = e <= 0 ? e = 0 : e >= 1 ? (e = 1,
                n - 1) : Math.floor(e * n)
                    , i = t[r]
                    , o = t[r + 1]
                    , u = r > 0 ? t[r - 1] : 2 * i - o
                    , a = r < n - 1 ? t[r + 2] : 2 * o - i;
                return Wt((e - r / n) * n, u, i, o, a)
            }
        }, Qf = function(t) {
            var n = t.length;
            return function(e) {
                var r = Math.floor(((e %= 1) < 0 ? ++e : e) * n)
                    , i = t[(r + n - 1) % n]
                    , o = t[r % n]
                    , u = t[(r + 1) % n]
                    , a = t[(r + 2) % n];
                return Wt((e - r / n) * n, i, o, u, a)
            }
        }, Kf = function(t) {
            return function() {
                return t
            }
        }, tl = function t(n) {
            function e(t, n) {
                var e = r((t = Et(t)).r, (n = Et(n)).r)
                    , i = r(t.g, n.g)
                    , o = r(t.b, n.b)
                    , u = Kt(t.opacity, n.opacity);
                return function(n) {
                    return t.r = e(n),
                        t.g = i(n),
                        t.b = o(n),
                        t.opacity = u(n),
                    t + ""
                }
            }
            var r = Qt(n);
            return e.gamma = t,
                e
        }(1), nl = tn(Jf), el = tn(Qf), rl = function(t, n) {
            var e, r = n ? n.length : 0, i = t ? Math.min(r, t.length) : 0, o = new Array(r), u = new Array(r);
            for (e = 0; e < i; ++e)
                o[e] = fl(t[e], n[e]);
            for (; e < r; ++e)
                u[e] = n[e];
            return function(t) {
                for (e = 0; e < i; ++e)
                    u[e] = o[e](t);
                return u
            }
        }, il = function(t, n) {
            var e = new Date;
            return t = +t,
                n -= t,
                function(r) {
                    return e.setTime(t + n * r),
                        e
                }
        }, ol = function(t, n) {
            return t = +t,
                n -= t,
                function(e) {
                    return t + n * e
                }
        }, ul = function(t, n) {
            var e, r = {}, i = {};
            null !== t && "object" == typeof t || (t = {}),
            null !== n && "object" == typeof n || (n = {});
            for (e in n)
                e in t ? r[e] = fl(t[e], n[e]) : i[e] = n[e];
            return function(t) {
                for (e in r)
                    i[e] = r[e](t);
                return i
            }
        }, al = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, cl = new RegExp(al.source,"g"), sl = function(t, n) {
            var e, r, i, o = al.lastIndex = cl.lastIndex = 0, u = -1, a = [], c = [];
            for (t += "",
                     n += ""; (e = al.exec(t)) && (r = cl.exec(n)); )
                (i = r.index) > o && (i = n.slice(o, i),
                    a[u] ? a[u] += i : a[++u] = i),
                    (e = e[0]) === (r = r[0]) ? a[u] ? a[u] += r : a[++u] = r : (a[++u] = null,
                        c.push({
                            i: u,
                            x: ol(e, r)
                        })),
                    o = cl.lastIndex;
            return o < n.length && (i = n.slice(o),
                a[u] ? a[u] += i : a[++u] = i),
                a.length < 2 ? c[0] ? en(c[0].x) : nn(n) : (n = c.length,
                        function(t) {
                            for (var e, r = 0; r < n; ++r)
                                a[(e = c[r]).i] = e.x(t);
                            return a.join("")
                        }
                )
        }, fl = function(t, n) {
            var e, r = typeof n;
            return null == n || "boolean" === r ? Kf(n) : ("number" === r ? ol : "string" === r ? (e = Tt(n)) ? (n = e,
                tl) : sl : n instanceof Tt ? tl : n instanceof Date ? il : Array.isArray(n) ? rl : "function" != typeof n.valueOf && "function" != typeof n.toString || isNaN(n) ? ul : ol)(t, n)
        }, ll = function(t, n) {
            return t = +t,
                n -= t,
                function(e) {
                    return Math.round(t + n * e)
                }
        }, hl = 180 / Math.PI, pl = {
            translateX: 0,
            translateY: 0,
            rotate: 0,
            skewX: 0,
            scaleX: 1,
            scaleY: 1
        }, dl = function(t, n, e, r, i, o) {
            var u, a, c;
            return (u = Math.sqrt(t * t + n * n)) && (t /= u,
                n /= u),
            (c = t * e + n * r) && (e -= t * c,
                r -= n * c),
            (a = Math.sqrt(e * e + r * r)) && (e /= a,
                r /= a,
                c /= a),
            t * r < n * e && (t = -t,
                n = -n,
                c = -c,
                u = -u),
                {
                    translateX: i,
                    translateY: o,
                    rotate: Math.atan2(n, t) * hl,
                    skewX: Math.atan(c) * hl,
                    scaleX: u,
                    scaleY: a
                }
        }, vl = rn(function(t) {
            return "none" === t ? pl : (Xf || (Xf = document.createElement("DIV"),
                $f = document.documentElement,
                Vf = document.defaultView),
                Xf.style.transform = t,
                t = Vf.getComputedStyle($f.appendChild(Xf), null).getPropertyValue("transform"),
                $f.removeChild(Xf),
                t = t.slice(7, -1).split(","),
                dl(+t[0], +t[1], +t[2], +t[3], +t[4], +t[5]))
        }, "px, ", "px)", "deg)"), _l = rn(function(t) {
            return null == t ? pl : (Wf || (Wf = document.createElementNS("http://www.w3.org/2000/svg", "g")),
                Wf.setAttribute("transform", t),
                (t = Wf.transform.baseVal.consolidate()) ? (t = t.matrix,
                    dl(t.a, t.b, t.c, t.d, t.e, t.f)) : pl)
        }, ", ", ")", ")"), gl = Math.SQRT2, yl = function(t, n) {
            var e, r, i = t[0], o = t[1], u = t[2], a = n[0], c = n[1], s = n[2], f = a - i, l = c - o, h = f * f + l * l;
            if (h < 1e-12)
                r = Math.log(s / u) / gl,
                    e = function(t) {
                        return [i + t * f, o + t * l, u * Math.exp(gl * t * r)]
                    }
                ;
            else {
                var p = Math.sqrt(h)
                    , d = (s * s - u * u + 4 * h) / (2 * u * 2 * p)
                    , v = (s * s - u * u - 4 * h) / (2 * s * 2 * p)
                    , _ = Math.log(Math.sqrt(d * d + 1) - d)
                    , g = Math.log(Math.sqrt(v * v + 1) - v);
                r = (g - _) / gl,
                    e = function(t) {
                        var n = t * r
                            , e = on(_)
                            , a = u / (2 * p) * (e * an(gl * n + _) - un(_));
                        return [i + a * f, o + a * l, u * e / on(gl * n + _)]
                    }
            }
            return e.duration = 1e3 * r,
                e
        }, ml = cn(Jt), xl = cn(Kt), bl = sn(Jt), wl = sn(Kt), Ml = fn(Jt), Tl = fn(Kt), Nl = 0, kl = 0, Sl = 0, El = 1e3, Al = 0, Cl = 0, zl = 0, Pl = "object" == typeof performance && performance.now ? performance : Date, Rl = "object" == typeof window && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(t) {
            setTimeout(t, 17)
        }
    ;
    pn.prototype = dn.prototype = {
        constructor: pn,
        restart: function(t, n, e) {
            if ("function" != typeof t)
                throw new TypeError("callback is not a function");
            e = (null == e ? ln() : +e) + (null == n ? 0 : +n),
            this._next || Gf === this || (Gf ? Gf._next = this : Zf = this,
                Gf = this),
                this._call = t,
                this._time = e,
                mn()
        },
        stop: function() {
            this._call && (this._call = null,
                this._time = 1 / 0,
                mn())
        }
    };
    var Ll = function(t, n, e) {
        var r = new pn;
        return n = null == n ? 0 : +n,
            r.restart(function(e) {
                r.stop(),
                    t(e + n)
            }, n, e),
            r
    }
        , ql = h("start", "end", "interrupt")
        , Ul = []
        , Dl = 0
        , Ol = 1
        , Fl = 2
        , Il = 3
        , Yl = 4
        , Bl = 5
        , jl = 6
        , Hl = function(t, n, e, r, i, o) {
        var u = t.__transition;
        if (u) {
            if (e in u)
                return
        } else
            t.__transition = {};
        Mn(t, e, {
            name: n,
            index: r,
            group: i,
            on: ql,
            tween: Ul,
            time: o.time,
            delay: o.delay,
            duration: o.duration,
            ease: o.ease,
            timer: null,
            state: Dl
        })
    }
        , Xl = function(t, n) {
        var e, r, i, o = t.__transition, u = !0;
        if (o) {
            n = null == n ? null : n + "";
            for (i in o)
                (e = o[i]).name === n ? (r = e.state > Fl && e.state < Bl,
                    e.state = jl,
                    e.timer.stop(),
                r && e.on.call("interrupt", t, t.__data__, e.index, e.group),
                    delete o[i]) : u = !1;
            u && delete t.__transition
        }
    }
        , $l = function(t, n) {
        var e;
        return ("number" == typeof n ? ol : n instanceof Tt ? tl : (e = Tt(n)) ? (n = e,
            tl) : sl)(t, n)
    }
        , Vl = dt.prototype.constructor
        , Wl = 0
        , Zl = dt.prototype;
    Gn.prototype = Jn.prototype = {
        constructor: Gn,
        select: function(t) {
            var n = this._name
                , e = this._id;
            "function" != typeof t && (t = ef(t));
            for (var r = this._groups, i = r.length, o = new Array(i), u = 0; u < i; ++u)
                for (var a, c, s = r[u], f = s.length, l = o[u] = new Array(f), h = 0; h < f; ++h)
                    (a = s[h]) && (c = t.call(a, a.__data__, h, s)) && ("__data__"in a && (c.__data__ = a.__data__),
                        l[h] = c,
                        Hl(l[h], n, e, h, l, wn(a, e)));
            return new Gn(o,this._parents,n,e)
        },
        selectAll: function(t) {
            var n = this._name
                , e = this._id;
            "function" != typeof t && (t = rf(t));
            for (var r = this._groups, i = r.length, o = [], u = [], a = 0; a < i; ++a)
                for (var c, s = r[a], f = s.length, l = 0; l < f; ++l)
                    if (c = s[l]) {
                        for (var h, p = t.call(c, c.__data__, l, s), d = wn(c, e), v = 0, _ = p.length; v < _; ++v)
                            (h = p[v]) && Hl(h, n, e, v, p, d);
                        o.push(p),
                            u.push(c)
                    }
            return new Gn(o,u,n,e)
        },
        filter: function(t) {
            "function" != typeof t && (t = Js(t));
            for (var n = this._groups, e = n.length, r = new Array(e), i = 0; i < e; ++i)
                for (var o, u = n[i], a = u.length, c = r[i] = [], s = 0; s < a; ++s)
                    (o = u[s]) && t.call(o, o.__data__, s, u) && c.push(o);
            return new Gn(r,this._parents,this._name,this._id)
        },
        merge: function(t) {
            if (t._id !== this._id)
                throw new Error;
            for (var n = this._groups, e = t._groups, r = n.length, i = e.length, o = Math.min(r, i), u = new Array(r), a = 0; a < o; ++a)
                for (var c, s = n[a], f = e[a], l = s.length, h = u[a] = new Array(l), p = 0; p < l; ++p)
                    (c = s[p] || f[p]) && (h[p] = c);
            for (; a < r; ++a)
                u[a] = n[a];
            return new Gn(u,this._parents,this._name,this._id)
        },
        selection: function() {
            return new Vl(this._groups,this._parents)
        },
        transition: function() {
            for (var t = this._name, n = this._id, e = Qn(), r = this._groups, i = r.length, o = 0; o < i; ++o)
                for (var u, a = r[o], c = a.length, s = 0; s < c; ++s)
                    if (u = a[s]) {
                        var f = wn(u, n);
                        Hl(u, t, e, s, a, {
                            time: f.time + f.delay + f.duration,
                            delay: 0,
                            duration: f.duration,
                            ease: f.ease
                        })
                    }
            return new Gn(r,this._parents,t,e)
        },
        call: Zl.call,
        nodes: Zl.nodes,
        node: Zl.node,
        size: Zl.size,
        empty: Zl.empty,
        each: Zl.each,
        on: function(t, n) {
            var e = this._id;
            return arguments.length < 2 ? wn(this.node(), e).on.on(t) : this.each(Yn(e, t, n))
        },
        attr: function(t, n) {
            var e = Xs(t)
                , r = "transform" === e ? _l : $l;
            return this.attrTween(t, "function" == typeof n ? (e.local ? Pn : zn)(e, r, kn(this, "attr." + t, n)) : null == n ? (e.local ? En : Sn)(e) : (e.local ? Cn : An)(e, r, n + ""))
        },
        attrTween: function(t, n) {
            var e = "attr." + t;
            if (arguments.length < 2)
                return (e = this.tween(e)) && e._value;
            if (null == n)
                return this.tween(e, null);
            if ("function" != typeof n)
                throw new Error;
            var r = Xs(t);
            return this.tween(e, (r.local ? Rn : Ln)(r, n))
        },
        style: function(t, n, e) {
            var r = "transform" == (t += "") ? vl : $l;
            return null == n ? this.styleTween(t, jn(t, r)).on("end.style." + t, Hn(t)) : this.styleTween(t, "function" == typeof n ? $n(t, r, kn(this, "style." + t, n)) : Xn(t, r, n + ""), e)
        },
        styleTween: function(t, n, e) {
            var r = "style." + (t += "");
            if (arguments.length < 2)
                return (r = this.tween(r)) && r._value;
            if (null == n)
                return this.tween(r, null);
            if ("function" != typeof n)
                throw new Error;
            return this.tween(r, Vn(t, n, null == e ? "" : e))
        },
        text: function(t) {
            return this.tween("text", "function" == typeof t ? Zn(kn(this, "text", t)) : Wn(null == t ? "" : t + ""))
        },
        remove: function() {
            return this.on("end.remove", Bn(this._id))
        },
        tween: function(t, n) {
            var e = this._id;
            if (t += "",
                arguments.length < 2) {
                for (var r, i = wn(this.node(), e).tween, o = 0, u = i.length; o < u; ++o)
                    if ((r = i[o]).name === t)
                        return r.value;
                return null
            }
            return this.each((null == n ? Tn : Nn)(e, t, n))
        },
        delay: function(t) {
            var n = this._id;
            return arguments.length ? this.each(("function" == typeof t ? qn : Un)(n, t)) : wn(this.node(), n).delay
        },
        duration: function(t) {
            var n = this._id;
            return arguments.length ? this.each(("function" == typeof t ? Dn : On)(n, t)) : wn(this.node(), n).duration
        },
        ease: function(t) {
            var n = this._id;
            return arguments.length ? this.each(Fn(n, t)) : wn(this.node(), n).ease
        }
    };
    var Gl = function t(n) {
        function e(t) {
            return Math.pow(t, n)
        }
        return n = +n,
            e.exponent = t,
            e
    }(3)
        , Jl = function t(n) {
        function e(t) {
            return 1 - Math.pow(1 - t, n)
        }
        return n = +n,
            e.exponent = t,
            e
    }(3)
        , Ql = function t(n) {
        function e(t) {
            return ((t *= 2) <= 1 ? Math.pow(t, n) : 2 - Math.pow(2 - t, n)) / 2
        }
        return n = +n,
            e.exponent = t,
            e
    }(3)
        , Kl = Math.PI
        , th = Kl / 2
        , nh = 4 / 11
        , eh = 6 / 11
        , rh = 8 / 11
        , ih = .75
        , oh = 9 / 11
        , uh = 10 / 11
        , ah = .9375
        , ch = 21 / 22
        , sh = 63 / 64
        , fh = 1 / nh / nh
        , lh = function t(n) {
        function e(t) {
            return t * t * ((n + 1) * t - n)
        }
        return n = +n,
            e.overshoot = t,
            e
    }(1.70158)
        , hh = function t(n) {
        function e(t) {
            return --t * t * ((n + 1) * t + n) + 1
        }
        return n = +n,
            e.overshoot = t,
            e
    }(1.70158)
        , ph = function t(n) {
        function e(t) {
            return ((t *= 2) < 1 ? t * t * ((n + 1) * t - n) : (t -= 2) * t * ((n + 1) * t + n) + 2) / 2
        }
        return n = +n,
            e.overshoot = t,
            e
    }(1.70158)
        , dh = 2 * Math.PI
        , vh = function t(n, e) {
        function r(t) {
            return n * Math.pow(2, 10 * --t) * Math.sin((i - t) / e)
        }
        var i = Math.asin(1 / (n = Math.max(1, n))) * (e /= dh);
        return r.amplitude = function(n) {
            return t(n, e * dh)
        }
            ,
            r.period = function(e) {
                return t(n, e)
            }
            ,
            r
    }(1, .3)
        , _h = function t(n, e) {
        function r(t) {
            return 1 - n * Math.pow(2, -10 * (t = +t)) * Math.sin((t + i) / e)
        }
        var i = Math.asin(1 / (n = Math.max(1, n))) * (e /= dh);
        return r.amplitude = function(n) {
            return t(n, e * dh)
        }
            ,
            r.period = function(e) {
                return t(n, e)
            }
            ,
            r
    }(1, .3)
        , gh = function t(n, e) {
        function r(t) {
            return ((t = 2 * t - 1) < 0 ? n * Math.pow(2, 10 * t) * Math.sin((i - t) / e) : 2 - n * Math.pow(2, -10 * t) * Math.sin((i + t) / e)) / 2
        }
        var i = Math.asin(1 / (n = Math.max(1, n))) * (e /= dh);
        return r.amplitude = function(n) {
            return t(n, e * dh)
        }
            ,
            r.period = function(e) {
                return t(n, e)
            }
            ,
            r
    }(1, .3)
        , yh = {
        time: null,
        delay: 0,
        duration: 250,
        ease: te
    };
    dt.prototype.interrupt = function(t) {
        return this.each(function() {
            Xl(this, t)
        })
    }
        ,
        dt.prototype.transition = function(t) {
            var n, e;
            t instanceof Gn ? (n = t._id,
                t = t._name) : (n = Qn(),
                (e = yh).time = ln(),
                t = null == t ? null : t + "");
            for (var r = this._groups, i = r.length, o = 0; o < i; ++o)
                for (var u, a = r[o], c = a.length, s = 0; s < c; ++s)
                    (u = a[s]) && Hl(u, t, n, s, a, e || oe(u, n));
            return new Gn(r,this._parents,t,n)
        }
    ;
    var mh = [null]
        , xh = function(t) {
        return function() {
            return t
        }
    }
        , bh = function(t, n, e) {
        this.target = t,
            this.type = n,
            this.selection = e
    }
        , wh = function() {
        t.event.preventDefault(),
            t.event.stopImmediatePropagation()
    }
        , Mh = {
        name: "drag"
    }
        , Th = {
        name: "space"
    }
        , Nh = {
        name: "handle"
    }
        , kh = {
        name: "center"
    }
        , Sh = {
        name: "x",
        handles: ["e", "w"].map(ae),
        input: function(t, n) {
            return t && [[t[0], n[0][1]], [t[1], n[1][1]]]
        },
        output: function(t) {
            return t && [t[0][0], t[1][0]]
        }
    }
        , Eh = {
        name: "y",
        handles: ["n", "s"].map(ae),
        input: function(t, n) {
            return t && [[n[0][0], t[0]], [n[1][0], t[1]]]
        },
        output: function(t) {
            return t && [t[0][1], t[1][1]]
        }
    }
        , Ah = {
        name: "xy",
        handles: ["n", "e", "s", "w", "nw", "ne", "se", "sw"].map(ae),
        input: function(t) {
            return t
        },
        output: function(t) {
            return t
        }
    }
        , Ch = {
        overlay: "crosshair",
        selection: "move",
        n: "ns-resize",
        e: "ew-resize",
        s: "ns-resize",
        w: "ew-resize",
        nw: "nwse-resize",
        ne: "nesw-resize",
        se: "nwse-resize",
        sw: "nesw-resize"
    }
        , zh = {
        e: "w",
        w: "e",
        nw: "ne",
        ne: "nw",
        se: "sw",
        sw: "se"
    }
        , Ph = {
        n: "s",
        s: "n",
        nw: "sw",
        ne: "se",
        se: "ne",
        sw: "nw"
    }
        , Rh = {
        overlay: 1,
        selection: 1,
        n: null,
        e: 1,
        s: null,
        w: -1,
        nw: -1,
        ne: 1,
        se: 1,
        sw: -1
    }
        , Lh = {
        overlay: 1,
        selection: 1,
        n: -1,
        e: null,
        s: 1,
        w: null,
        nw: -1,
        ne: -1,
        se: 1,
        sw: 1
    }
        , qh = Math.cos
        , Uh = Math.sin
        , Dh = Math.PI
        , Oh = Dh / 2
        , Fh = 2 * Dh
        , Ih = Math.max
        , Yh = Array.prototype.slice
        , Bh = function(t) {
        return function() {
            return t
        }
    }
        , jh = Math.PI
        , Hh = 2 * jh
        , Xh = Hh - 1e-6;
    de.prototype = ve.prototype = {
        constructor: de,
        moveTo: function(t, n) {
            this._ += "M" + (this._x0 = this._x1 = +t) + "," + (this._y0 = this._y1 = +n)
        },
        closePath: function() {
            null !== this._x1 && (this._x1 = this._x0,
                this._y1 = this._y0,
                this._ += "Z")
        },
        lineTo: function(t, n) {
            this._ += "L" + (this._x1 = +t) + "," + (this._y1 = +n)
        },
        quadraticCurveTo: function(t, n, e, r) {
            this._ += "Q" + +t + "," + +n + "," + (this._x1 = +e) + "," + (this._y1 = +r)
        },
        bezierCurveTo: function(t, n, e, r, i, o) {
            this._ += "C" + +t + "," + +n + "," + +e + "," + +r + "," + (this._x1 = +i) + "," + (this._y1 = +o)
        },
        arcTo: function(t, n, e, r, i) {
            t = +t,
                n = +n,
                e = +e,
                r = +r,
                i = +i;
            var o = this._x1
                , u = this._y1
                , a = e - t
                , c = r - n
                , s = o - t
                , f = u - n
                , l = s * s + f * f;
            if (i < 0)
                throw new Error("negative radius: " + i);
            if (null === this._x1)
                this._ += "M" + (this._x1 = t) + "," + (this._y1 = n);
            else if (l > 1e-6)
                if (Math.abs(f * a - c * s) > 1e-6 && i) {
                    var h = e - o
                        , p = r - u
                        , d = a * a + c * c
                        , v = h * h + p * p
                        , _ = Math.sqrt(d)
                        , g = Math.sqrt(l)
                        , y = i * Math.tan((jh - Math.acos((d + l - v) / (2 * _ * g))) / 2)
                        , m = y / g
                        , x = y / _;
                    Math.abs(m - 1) > 1e-6 && (this._ += "L" + (t + m * s) + "," + (n + m * f)),
                        this._ += "A" + i + "," + i + ",0,0," + +(f * h > s * p) + "," + (this._x1 = t + x * a) + "," + (this._y1 = n + x * c)
                } else
                    this._ += "L" + (this._x1 = t) + "," + (this._y1 = n);
            else
                ;
        },
        arc: function(t, n, e, r, i, o) {
            t = +t,
                n = +n;
            var u = (e = +e) * Math.cos(r)
                , a = e * Math.sin(r)
                , c = t + u
                , s = n + a
                , f = 1 ^ o
                , l = o ? r - i : i - r;
            if (e < 0)
                throw new Error("negative radius: " + e);
            null === this._x1 ? this._ += "M" + c + "," + s : (Math.abs(this._x1 - c) > 1e-6 || Math.abs(this._y1 - s) > 1e-6) && (this._ += "L" + c + "," + s),
            e && (l < 0 && (l = l % Hh + Hh),
                l > Xh ? this._ += "A" + e + "," + e + ",0,1," + f + "," + (t - u) + "," + (n - a) + "A" + e + "," + e + ",0,1," + f + "," + (this._x1 = c) + "," + (this._y1 = s) : l > 1e-6 && (this._ += "A" + e + "," + e + ",0," + +(l >= jh) + "," + f + "," + (this._x1 = t + e * Math.cos(i)) + "," + (this._y1 = n + e * Math.sin(i))))
        },
        rect: function(t, n, e, r) {
            this._ += "M" + (this._x0 = this._x1 = +t) + "," + (this._y0 = this._y1 = +n) + "h" + +e + "v" + +r + "h" + -e + "Z"
        },
        toString: function() {
            return this._
        }
    };
    be.prototype = we.prototype = {
        constructor: be,
        has: function(t) {
            return "$" + t in this
        },
        get: function(t) {
            return this["$" + t]
        },
        set: function(t, n) {
            return this["$" + t] = n,
                this
        },
        remove: function(t) {
            var n = "$" + t;
            return n in this && delete this[n]
        },
        clear: function() {
            for (var t in this)
                "$" === t[0] && delete this[t]
        },
        keys: function() {
            var t = [];
            for (var n in this)
                "$" === n[0] && t.push(n.slice(1));
            return t
        },
        values: function() {
            var t = [];
            for (var n in this)
                "$" === n[0] && t.push(this[n]);
            return t
        },
        entries: function() {
            var t = [];
            for (var n in this)
                "$" === n[0] && t.push({
                    key: n.slice(1),
                    value: this[n]
                });
            return t
        },
        size: function() {
            var t = 0;
            for (var n in this)
                "$" === n[0] && ++t;
            return t
        },
        empty: function() {
            for (var t in this)
                if ("$" === t[0])
                    return !1;
            return !0
        },
        each: function(t) {
            for (var n in this)
                "$" === n[0] && t(this[n], n.slice(1), this)
        }
    };
    var $h = we.prototype;
    Se.prototype = Ee.prototype = {
        constructor: Se,
        has: $h.has,
        add: function(t) {
            return t += "",
                this["$" + t] = t,
                this
        },
        remove: $h.remove,
        clear: $h.clear,
        values: $h.keys,
        size: $h.size,
        empty: $h.empty,
        each: $h.each
    };
    var Vh = {}
        , Wh = {}
        , Zh = 34
        , Gh = 10
        , Jh = 13
        , Qh = function(t) {
        function n(t, n) {
            function e() {
                if (s)
                    return Wh;
                if (f)
                    return f = !1,
                        Vh;
                var n, e, r = a;
                if (t.charCodeAt(r) === Zh) {
                    for (; a++ < u && t.charCodeAt(a) !== Zh || t.charCodeAt(++a) === Zh; )
                        ;
                    return (n = a) >= u ? s = !0 : (e = t.charCodeAt(a++)) === Gh ? f = !0 : e === Jh && (f = !0,
                    t.charCodeAt(a) === Gh && ++a),
                        t.slice(r + 1, n - 1).replace(/""/g, '"')
                }
                for (; a < u; ) {
                    if ((e = t.charCodeAt(n = a++)) === Gh)
                        f = !0;
                    else if (e === Jh)
                        f = !0,
                        t.charCodeAt(a) === Gh && ++a;
                    else if (e !== o)
                        continue;
                    return t.slice(r, n)
                }
                return s = !0,
                    t.slice(r, u)
            }
            var r, i = [], u = t.length, a = 0, c = 0, s = u <= 0, f = !1;
            for (t.charCodeAt(u - 1) === Gh && --u,
                 t.charCodeAt(u - 1) === Jh && --u; (r = e()) !== Wh; ) {
                for (var l = []; r !== Vh && r !== Wh; )
                    l.push(r),
                        r = e();
                n && null == (l = n(l, c++)) || i.push(l)
            }
            return i
        }
        function e(n) {
            return n.map(r).join(t)
        }
        function r(t) {
            return null == t ? "" : i.test(t += "") ? '"' + t.replace(/"/g, '""') + '"' : t
        }
        var i = new RegExp('["' + t + "\n\r]")
            , o = t.charCodeAt(0);
        return {
            parse: function(t, e) {
                var r, i, o = n(t, function(t, n) {
                    if (r)
                        return r(t, n - 1);
                    i = t,
                        r = e ? Ce(t, e) : Ae(t)
                });
                return o.columns = i,
                    o
            },
            parseRows: n,
            format: function(n, e) {
                return null == e && (e = ze(n)),
                    [e.map(r).join(t)].concat(n.map(function(n) {
                        return e.map(function(t) {
                            return r(n[t])
                        }).join(t)
                    })).join("\n")
            },
            formatRows: function(t) {
                return t.map(e).join("\n")
            }
        }
    }
        , Kh = Qh(",")
        , tp = Kh.parse
        , np = Kh.parseRows
        , ep = Kh.format
        , rp = Kh.formatRows
        , ip = Qh("\t")
        , op = ip.parse
        , up = ip.parseRows
        , ap = ip.format
        , cp = ip.formatRows
        , sp = function(t) {
        return function() {
            return t
        }
    }
        , fp = function() {
        return 1e-6 * (Math.random() - .5)
    }
        , lp = function(t, n, e, r, i) {
        this.node = t,
            this.x0 = n,
            this.y0 = e,
            this.x1 = r,
            this.y1 = i
    }
        , hp = qe.prototype = Ue.prototype;
    hp.copy = function() {
        var t, n, e = new Ue(this._x,this._y,this._x0,this._y0,this._x1,this._y1), r = this._root;
        if (!r)
            return e;
        if (!r.length)
            return e._root = De(r),
                e;
        for (t = [{
            source: r,
            target: e._root = new Array(4)
        }]; r = t.pop(); )
            for (var i = 0; i < 4; ++i)
                (n = r.source[i]) && (n.length ? t.push({
                    source: n,
                    target: r.target[i] = new Array(4)
                }) : r.target[i] = De(n));
        return e
    }
        ,
        hp.add = function(t) {
            var n = +this._x.call(null, t)
                , e = +this._y.call(null, t);
            return Pe(this.cover(n, e), n, e, t)
        }
        ,
        hp.addAll = function(t) {
            var n, e, r, i, o = t.length, u = new Array(o), a = new Array(o), c = 1 / 0, s = 1 / 0, f = -1 / 0, l = -1 / 0;
            for (e = 0; e < o; ++e)
                isNaN(r = +this._x.call(null, n = t[e])) || isNaN(i = +this._y.call(null, n)) || (u[e] = r,
                    a[e] = i,
                r < c && (c = r),
                r > f && (f = r),
                i < s && (s = i),
                i > l && (l = i));
            for (f < c && (c = this._x0,
                f = this._x1),
                 l < s && (s = this._y0,
                     l = this._y1),
                     this.cover(c, s).cover(f, l),
                     e = 0; e < o; ++e)
                Pe(this, u[e], a[e], t[e]);
            return this
        }
        ,
        hp.cover = function(t, n) {
            if (isNaN(t = +t) || isNaN(n = +n))
                return this;
            var e = this._x0
                , r = this._y0
                , i = this._x1
                , o = this._y1;
            if (isNaN(e))
                i = (e = Math.floor(t)) + 1,
                    o = (r = Math.floor(n)) + 1;
            else {
                if (!(e > t || t > i || r > n || n > o))
                    return this;
                var u, a, c = i - e, s = this._root;
                switch (a = (n < (r + o) / 2) << 1 | t < (e + i) / 2) {
                    case 0:
                        do {
                            u = new Array(4),
                                u[a] = s,
                                s = u
                        } while (c *= 2,
                            i = e + c,
                            o = r + c,
                        t > i || n > o);break;
                    case 1:
                        do {
                            u = new Array(4),
                                u[a] = s,
                                s = u
                        } while (c *= 2,
                            e = i - c,
                            o = r + c,
                        e > t || n > o);break;
                    case 2:
                        do {
                            u = new Array(4),
                                u[a] = s,
                                s = u
                        } while (c *= 2,
                            i = e + c,
                            r = o - c,
                        t > i || r > n);break;
                    case 3:
                        do {
                            u = new Array(4),
                                u[a] = s,
                                s = u
                        } while (c *= 2,
                            e = i - c,
                            r = o - c,
                        e > t || r > n)
                }
                this._root && this._root.length && (this._root = s)
            }
            return this._x0 = e,
                this._y0 = r,
                this._x1 = i,
                this._y1 = o,
                this
        }
        ,
        hp.data = function() {
            var t = [];
            return this.visit(function(n) {
                if (!n.length)
                    do {
                        t.push(n.data)
                    } while (n = n.next)
            }),
                t
        }
        ,
        hp.extent = function(t) {
            return arguments.length ? this.cover(+t[0][0], +t[0][1]).cover(+t[1][0], +t[1][1]) : isNaN(this._x0) ? void 0 : [[this._x0, this._y0], [this._x1, this._y1]]
        }
        ,
        hp.find = function(t, n, e) {
            var r, i, o, u, a, c, s, f = this._x0, l = this._y0, h = this._x1, p = this._y1, d = [], v = this._root;
            for (v && d.push(new lp(v,f,l,h,p)),
                     null == e ? e = 1 / 0 : (f = t - e,
                         l = n - e,
                         h = t + e,
                         p = n + e,
                         e *= e); c = d.pop(); )
                if (!(!(v = c.node) || (i = c.x0) > h || (o = c.y0) > p || (u = c.x1) < f || (a = c.y1) < l))
                    if (v.length) {
                        var _ = (i + u) / 2
                            , g = (o + a) / 2;
                        d.push(new lp(v[3],_,g,u,a), new lp(v[2],i,g,_,a), new lp(v[1],_,o,u,g), new lp(v[0],i,o,_,g)),
                        (s = (n >= g) << 1 | t >= _) && (c = d[d.length - 1],
                            d[d.length - 1] = d[d.length - 1 - s],
                            d[d.length - 1 - s] = c)
                    } else {
                        var y = t - +this._x.call(null, v.data)
                            , m = n - +this._y.call(null, v.data)
                            , x = y * y + m * m;
                        if (x < e) {
                            var b = Math.sqrt(e = x);
                            f = t - b,
                                l = n - b,
                                h = t + b,
                                p = n + b,
                                r = v.data
                        }
                    }
            return r
        }
        ,
        hp.remove = function(t) {
            if (isNaN(o = +this._x.call(null, t)) || isNaN(u = +this._y.call(null, t)))
                return this;
            var n, e, r, i, o, u, a, c, s, f, l, h, p = this._root, d = this._x0, v = this._y0, _ = this._x1, g = this._y1;
            if (!p)
                return this;
            if (p.length)
                for (; ; ) {
                    if ((s = o >= (a = (d + _) / 2)) ? d = a : _ = a,
                            (f = u >= (c = (v + g) / 2)) ? v = c : g = c,
                            n = p,
                            !(p = p[l = f << 1 | s]))
                        return this;
                    if (!p.length)
                        break;
                    (n[l + 1 & 3] || n[l + 2 & 3] || n[l + 3 & 3]) && (e = n,
                        h = l)
                }
            for (; p.data !== t; )
                if (r = p,
                        !(p = p.next))
                    return this;
            return (i = p.next) && delete p.next,
                r ? (i ? r.next = i : delete r.next,
                    this) : n ? (i ? n[l] = i : delete n[l],
                (p = n[0] || n[1] || n[2] || n[3]) && p === (n[3] || n[2] || n[1] || n[0]) && !p.length && (e ? e[h] = p : this._root = p),
                    this) : (this._root = i,
                    this)
        }
        ,
        hp.removeAll = function(t) {
            for (var n = 0, e = t.length; n < e; ++n)
                this.remove(t[n]);
            return this
        }
        ,
        hp.root = function() {
            return this._root
        }
        ,
        hp.size = function() {
            var t = 0;
            return this.visit(function(n) {
                if (!n.length)
                    do {
                        ++t
                    } while (n = n.next)
            }),
                t
        }
        ,
        hp.visit = function(t) {
            var n, e, r, i, o, u, a = [], c = this._root;
            for (c && a.push(new lp(c,this._x0,this._y0,this._x1,this._y1)); n = a.pop(); )
                if (!t(c = n.node, r = n.x0, i = n.y0, o = n.x1, u = n.y1) && c.length) {
                    var s = (r + o) / 2
                        , f = (i + u) / 2;
                    (e = c[3]) && a.push(new lp(e,s,f,o,u)),
                    (e = c[2]) && a.push(new lp(e,r,f,s,u)),
                    (e = c[1]) && a.push(new lp(e,s,i,o,f)),
                    (e = c[0]) && a.push(new lp(e,r,i,s,f))
                }
            return this
        }
        ,
        hp.visitAfter = function(t) {
            var n, e = [], r = [];
            for (this._root && e.push(new lp(this._root,this._x0,this._y0,this._x1,this._y1)); n = e.pop(); ) {
                var i = n.node;
                if (i.length) {
                    var o, u = n.x0, a = n.y0, c = n.x1, s = n.y1, f = (u + c) / 2, l = (a + s) / 2;
                    (o = i[0]) && e.push(new lp(o,u,a,f,l)),
                    (o = i[1]) && e.push(new lp(o,f,a,c,l)),
                    (o = i[2]) && e.push(new lp(o,u,l,f,s)),
                    (o = i[3]) && e.push(new lp(o,f,l,c,s))
                }
                r.push(n)
            }
            for (; n = r.pop(); )
                t(n.node, n.x0, n.y0, n.x1, n.y1);
            return this
        }
        ,
        hp.x = function(t) {
            return arguments.length ? (this._x = t,
                this) : this._x
        }
        ,
        hp.y = function(t) {
            return arguments.length ? (this._y = t,
                this) : this._y
        }
    ;
    var pp, dp = 10, vp = Math.PI * (3 - Math.sqrt(5)), _p = function(t, n) {
        if ((e = (t = n ? t.toExponential(n - 1) : t.toExponential()).indexOf("e")) < 0)
            return null;
        var e, r = t.slice(0, e);
        return [r.length > 1 ? r[0] + r.slice(2) : r, +t.slice(e + 1)]
    }, gp = function(t) {
        return (t = _p(Math.abs(t))) ? t[1] : NaN
    }, yp = function(t, n) {
        return function(e, r) {
            for (var i = e.length, o = [], u = 0, a = t[0], c = 0; i > 0 && a > 0 && (c + a + 1 > r && (a = Math.max(1, r - c)),
                o.push(e.substring(i -= a, i + a)),
                !((c += a + 1) > r)); )
                a = t[u = (u + 1) % t.length];
            return o.reverse().join(n)
        }
    }, mp = function(t) {
        return function(n) {
            return n.replace(/[0-9]/g, function(n) {
                return t[+n]
            })
        }
    }, xp = function(t, n) {
        var e = _p(t, n);
        if (!e)
            return t + "";
        var r = e[0]
            , i = e[1];
        return i < 0 ? "0." + new Array(-i).join("0") + r : r.length > i + 1 ? r.slice(0, i + 1) + "." + r.slice(i + 1) : r + new Array(i - r.length + 2).join("0")
    }, bp = {
        "": function(t, n) {
            t: for (var e, r = (t = t.toPrecision(n)).length, i = 1, o = -1; i < r; ++i)
                switch (t[i]) {
                    case ".":
                        o = e = i;
                        break;
                    case "0":
                        0 === o && (o = i),
                            e = i;
                        break;
                    case "e":
                        break t;
                    default:
                        o > 0 && (o = 0)
                }
            return o > 0 ? t.slice(0, o) + t.slice(e + 1) : t
        },
        "%": function(t, n) {
            return (100 * t).toFixed(n)
        },
        b: function(t) {
            return Math.round(t).toString(2)
        },
        c: function(t) {
            return t + ""
        },
        d: function(t) {
            return Math.round(t).toString(10)
        },
        e: function(t, n) {
            return t.toExponential(n)
        },
        f: function(t, n) {
            return t.toFixed(n)
        },
        g: function(t, n) {
            return t.toPrecision(n)
        },
        o: function(t) {
            return Math.round(t).toString(8)
        },
        p: function(t, n) {
            return xp(100 * t, n)
        },
        r: xp,
        s: function(t, n) {
            var e = _p(t, n);
            if (!e)
                return t + "";
            var r = e[0]
                , i = e[1]
                , o = i - (pp = 3 * Math.max(-8, Math.min(8, Math.floor(i / 3)))) + 1
                , u = r.length;
            return o === u ? r : o > u ? r + new Array(o - u + 1).join("0") : o > 0 ? r.slice(0, o) + "." + r.slice(o) : "0." + new Array(1 - o).join("0") + _p(t, Math.max(0, n + o - 1))[0]
        },
        X: function(t) {
            return Math.round(t).toString(16).toUpperCase()
        },
        x: function(t) {
            return Math.round(t).toString(16)
        }
    }, wp = /^(?:(.)?([<>=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i;
    He.prototype = Xe.prototype,
        Xe.prototype.toString = function() {
            return this.fill + this.align + this.sign + this.symbol + (this.zero ? "0" : "") + (null == this.width ? "" : Math.max(1, 0 | this.width)) + (this.comma ? "," : "") + (null == this.precision ? "" : "." + Math.max(0, 0 | this.precision)) + this.type
        }
    ;
    var Mp, Tp = function(t) {
        return t
    }, Np = ["y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y"], kp = function(t) {
        function n(t) {
            function n(t) {
                var n, r, u, f = _, x = g;
                if ("c" === v)
                    x = y(t) + x,
                        t = "";
                else {
                    var b = (t = +t) < 0;
                    if (t = y(Math.abs(t), d),
                        b && 0 == +t && (b = !1),
                            f = (b ? "(" === s ? s : "-" : "-" === s || "(" === s ? "" : s) + f,
                            x = x + ("s" === v ? Np[8 + pp / 3] : "") + (b && "(" === s ? ")" : ""),
                            m)
                        for (n = -1,
                                 r = t.length; ++n < r; )
                            if (48 > (u = t.charCodeAt(n)) || u > 57) {
                                x = (46 === u ? i + t.slice(n + 1) : t.slice(n)) + x,
                                    t = t.slice(0, n);
                                break
                            }
                }
                p && !l && (t = e(t, 1 / 0));
                var w = f.length + t.length + x.length
                    , M = w < h ? new Array(h - w + 1).join(a) : "";
                switch (p && l && (t = e(M + t, M.length ? h - x.length : 1 / 0),
                    M = ""),
                    c) {
                    case "<":
                        t = f + t + x + M;
                        break;
                    case "=":
                        t = f + M + t + x;
                        break;
                    case "^":
                        t = M.slice(0, w = M.length >> 1) + f + t + x + M.slice(w);
                        break;
                    default:
                        t = M + f + t + x
                }
                return o(t)
            }
            var a = (t = He(t)).fill
                , c = t.align
                , s = t.sign
                , f = t.symbol
                , l = t.zero
                , h = t.width
                , p = t.comma
                , d = t.precision
                , v = t.type
                , _ = "$" === f ? r[0] : "#" === f && /[boxX]/.test(v) ? "0" + v.toLowerCase() : ""
                , g = "$" === f ? r[1] : /[%p]/.test(v) ? u : ""
                , y = bp[v]
                , m = !v || /[defgprs%]/.test(v);
            return d = null == d ? v ? 6 : 12 : /[gprs]/.test(v) ? Math.max(1, Math.min(21, d)) : Math.max(0, Math.min(20, d)),
                n.toString = function() {
                    return t + ""
                }
                ,
                n
        }
        var e = t.grouping && t.thousands ? yp(t.grouping, t.thousands) : Tp
            , r = t.currency
            , i = t.decimal
            , o = t.numerals ? mp(t.numerals) : Tp
            , u = t.percent || "%";
        return {
            format: n,
            formatPrefix: function(t, e) {
                var r = n((t = He(t),
                    t.type = "f",
                    t))
                    , i = 3 * Math.max(-8, Math.min(8, Math.floor(gp(e) / 3)))
                    , o = Math.pow(10, -i)
                    , u = Np[8 + i / 3];
                return function(t) {
                    return r(o * t) + u
                }
            }
        }
    };
    $e({
        decimal: ".",
        thousands: ",",
        grouping: [3],
        currency: ["$", ""]
    });
    var Sp = function(t) {
        return Math.max(0, -gp(Math.abs(t)))
    }
        , Ep = function(t, n) {
        return Math.max(0, 3 * Math.max(-8, Math.min(8, Math.floor(gp(n) / 3))) - gp(Math.abs(t)))
    }
        , Ap = function(t, n) {
        return t = Math.abs(t),
            n = Math.abs(n) - t,
        Math.max(0, gp(n) - gp(t)) + 1
    }
        , Cp = function() {
        return new Ve
    };
    Ve.prototype = {
        constructor: Ve,
        reset: function() {
            this.s = this.t = 0
        },
        add: function(t) {
            We(cd, t, this.t),
                We(this, cd.s, this.s),
                this.s ? this.t += cd.t : this.s = cd.t
        },
        valueOf: function() {
            return this.s
        }
    };
    var zp, Pp, Rp, Lp, qp, Up, Dp, Op, Fp, Ip, Yp, Bp, jp, Hp, Xp, $p, Vp, Wp, Zp, Gp, Jp, Qp, Kp, td, nd, ed, rd, id, od, ud, ad, cd = new Ve, sd = 1e-6, fd = Math.PI, ld = fd / 2, hd = fd / 4, pd = 2 * fd, dd = 180 / fd, vd = fd / 180, _d = Math.abs, gd = Math.atan, yd = Math.atan2, md = Math.cos, xd = Math.ceil, bd = Math.exp, wd = Math.log, Md = Math.pow, Td = Math.sin, Nd = Math.sign || function(t) {
        return t > 0 ? 1 : t < 0 ? -1 : 0
    }
        , kd = Math.sqrt, Sd = Math.tan, Ed = {
        Feature: function(t, n) {
            Ke(t.geometry, n)
        },
        FeatureCollection: function(t, n) {
            for (var e = t.features, r = -1, i = e.length; ++r < i; )
                Ke(e[r].geometry, n)
        }
    }, Ad = {
        Sphere: function(t, n) {
            n.sphere()
        },
        Point: function(t, n) {
            t = t.coordinates,
                n.point(t[0], t[1], t[2])
        },
        MultiPoint: function(t, n) {
            for (var e = t.coordinates, r = -1, i = e.length; ++r < i; )
                t = e[r],
                    n.point(t[0], t[1], t[2])
        },
        LineString: function(t, n) {
            tr(t.coordinates, n, 0)
        },
        MultiLineString: function(t, n) {
            for (var e = t.coordinates, r = -1, i = e.length; ++r < i; )
                tr(e[r], n, 0)
        },
        Polygon: function(t, n) {
            nr(t.coordinates, n)
        },
        MultiPolygon: function(t, n) {
            for (var e = t.coordinates, r = -1, i = e.length; ++r < i; )
                nr(e[r], n)
        },
        GeometryCollection: function(t, n) {
            for (var e = t.geometries, r = -1, i = e.length; ++r < i; )
                Ke(e[r], n)
        }
    }, Cd = function(t, n) {
        t && Ed.hasOwnProperty(t.type) ? Ed[t.type](t, n) : Ke(t, n)
    }, zd = Cp(), Pd = Cp(), Rd = {
        point: Qe,
        lineStart: Qe,
        lineEnd: Qe,
        polygonStart: function() {
            zd.reset(),
                Rd.lineStart = er,
                Rd.lineEnd = rr
        },
        polygonEnd: function() {
            var t = +zd;
            Pd.add(t < 0 ? pd + t : t),
                this.lineStart = this.lineEnd = this.point = Qe
        },
        sphere: function() {
            Pd.add(pd)
        }
    }, Ld = Cp(), qd = {
        point: pr,
        lineStart: vr,
        lineEnd: _r,
        polygonStart: function() {
            qd.point = gr,
                qd.lineStart = yr,
                qd.lineEnd = mr,
                Ld.reset(),
                Rd.polygonStart()
        },
        polygonEnd: function() {
            Rd.polygonEnd(),
                qd.point = pr,
                qd.lineStart = vr,
                qd.lineEnd = _r,
                zd < 0 ? (Up = -(Op = 180),
                    Dp = -(Fp = 90)) : Ld > sd ? Fp = 90 : Ld < -sd && (Dp = -90),
                Xp[0] = Up,
                Xp[1] = Op
        }
    }, Ud = {
        sphere: Qe,
        point: Mr,
        lineStart: Nr,
        lineEnd: Er,
        polygonStart: function() {
            Ud.lineStart = Ar,
                Ud.lineEnd = Cr
        },
        polygonEnd: function() {
            Ud.lineStart = Nr,
                Ud.lineEnd = Er
        }
    }, Dd = function(t) {
        return function() {
            return t
        }
    }, Od = function(t, n) {
        function e(e, r) {
            return e = t(e, r),
                n(e[0], e[1])
        }
        return t.invert && n.invert && (e.invert = function(e, r) {
                return (e = n.invert(e, r)) && t.invert(e[0], e[1])
            }
        ),
            e
    };
    Rr.invert = Rr;
    var Fd, Id, Yd, Bd, jd, Hd, Xd, $d, Vd, Wd, Zd, Gd = function(t) {
        function n(n) {
            return n = t(n[0] * vd, n[1] * vd),
                n[0] *= dd,
                n[1] *= dd,
                n
        }
        return t = Lr(t[0] * vd, t[1] * vd, t.length > 2 ? t[2] * vd : 0),
            n.invert = function(n) {
                return n = t.invert(n[0] * vd, n[1] * vd),
                    n[0] *= dd,
                    n[1] *= dd,
                    n
            }
            ,
            n
    }, Jd = function() {
        var t, n = [];
        return {
            point: function(n, e) {
                t.push([n, e])
            },
            lineStart: function() {
                n.push(t = [])
            },
            lineEnd: Qe,
            rejoin: function() {
                n.length > 1 && n.push(n.pop().concat(n.shift()))
            },
            result: function() {
                var e = n;
                return n = [],
                    t = null,
                    e
            }
        }
    }, Qd = function(t, n) {
        return _d(t[0] - n[0]) < sd && _d(t[1] - n[1]) < sd
    }, Kd = function(t, n, e, r, i) {
        var o, u, a = [], c = [];
        if (t.forEach(function(t) {
                if (!((n = t.length - 1) <= 0)) {
                    var n, e, r = t[0], u = t[n];
                    if (Qd(r, u)) {
                        for (i.lineStart(),
                                 o = 0; o < n; ++o)
                            i.point((r = t[o])[0], r[1]);
                        i.lineEnd()
                    } else
                        a.push(e = new Ir(r,t,null,!0)),
                            c.push(e.o = new Ir(r,null,e,!1)),
                            a.push(e = new Ir(u,t,null,!1)),
                            c.push(e.o = new Ir(u,null,e,!0))
                }
            }),
                a.length) {
            for (c.sort(n),
                     Yr(a),
                     Yr(c),
                     o = 0,
                     u = c.length; o < u; ++o)
                c[o].e = e = !e;
            for (var s, f, l = a[0]; ; ) {
                for (var h = l, p = !0; h.v; )
                    if ((h = h.n) === l)
                        return;
                s = h.z,
                    i.lineStart();
                do {
                    if (h.v = h.o.v = !0,
                            h.e) {
                        if (p)
                            for (o = 0,
                                     u = s.length; o < u; ++o)
                                i.point((f = s[o])[0], f[1]);
                        else
                            r(h.x, h.n.x, 1, i);
                        h = h.n
                    } else {
                        if (p)
                            for (s = h.p.z,
                                     o = s.length - 1; o >= 0; --o)
                                i.point((f = s[o])[0], f[1]);
                        else
                            r(h.x, h.p.x, -1, i);
                        h = h.p
                    }
                    s = (h = h.o).z,
                        p = !p
                } while (!h.v);i.lineEnd()
            }
        }
    }, tv = Cp(), nv = function(t, n) {
        var e = n[0]
            , r = n[1]
            , i = [Td(e), -md(e), 0]
            , o = 0
            , u = 0;
        tv.reset();
        for (var a = 0, c = t.length; a < c; ++a)
            if (f = (s = t[a]).length)
                for (var s, f, l = s[f - 1], h = l[0], p = l[1] / 2 + hd, d = Td(p), v = md(p), _ = 0; _ < f; ++_,
                    h = y,
                    d = x,
                    v = b,
                    l = g) {
                    var g = s[_]
                        , y = g[0]
                        , m = g[1] / 2 + hd
                        , x = Td(m)
                        , b = md(m)
                        , w = y - h
                        , M = w >= 0 ? 1 : -1
                        , T = M * w
                        , N = T > fd
                        , k = d * x;
                    if (tv.add(yd(k * M * Td(T), v * b + k * md(T))),
                            o += N ? w + M * pd : w,
                        N ^ h >= e ^ y >= e) {
                        var S = sr(ar(l), ar(g));
                        hr(S);
                        var E = sr(i, S);
                        hr(E);
                        var A = (N ^ w >= 0 ? -1 : 1) * Ge(E[2]);
                        (r > A || r === A && (S[0] || S[1])) && (u += N ^ w >= 0 ? 1 : -1)
                    }
                }
        return (o < -sd || o < sd && tv < -sd) ^ 1 & u
    }, ev = function(t, n, e, r) {
        return function(i) {
            function o(n, e) {
                t(n, e) && i.point(n, e)
            }
            function u(t, n) {
                v.point(t, n)
            }
            function a() {
                m.point = u,
                    v.lineStart()
            }
            function c() {
                m.point = o,
                    v.lineEnd()
            }
            function s(t, n) {
                d.push([t, n]),
                    g.point(t, n)
            }
            function f() {
                g.lineStart(),
                    d = []
            }
            function l() {
                s(d[0][0], d[0][1]),
                    g.lineEnd();
                var t, n, e, r, o = g.clean(), u = _.result(), a = u.length;
                if (d.pop(),
                        h.push(d),
                        d = null,
                        a)
                    if (1 & o) {
                        if (e = u[0],
                            (n = e.length - 1) > 0) {
                            for (y || (i.polygonStart(),
                                y = !0),
                                     i.lineStart(),
                                     t = 0; t < n; ++t)
                                i.point((r = e[t])[0], r[1]);
                            i.lineEnd()
                        }
                    } else
                        a > 1 && 2 & o && u.push(u.pop().concat(u.shift())),
                            p.push(u.filter(Br))
            }
            var h, p, d, v = n(i), _ = Jd(), g = n(_), y = !1, m = {
                point: o,
                lineStart: a,
                lineEnd: c,
                polygonStart: function() {
                    m.point = s,
                        m.lineStart = f,
                        m.lineEnd = l,
                        p = [],
                        h = []
                },
                polygonEnd: function() {
                    m.point = o,
                        m.lineStart = a,
                        m.lineEnd = c,
                        p = Ps(p);
                    var t = nv(h, r);
                    p.length ? (y || (i.polygonStart(),
                        y = !0),
                        Kd(p, jr, t, e, i)) : t && (y || (i.polygonStart(),
                        y = !0),
                        i.lineStart(),
                        e(null, null, 1, i),
                        i.lineEnd()),
                    y && (i.polygonEnd(),
                        y = !1),
                        p = h = null
                },
                sphere: function() {
                    i.polygonStart(),
                        i.lineStart(),
                        e(null, null, 1, i),
                        i.lineEnd(),
                        i.polygonEnd()
                }
            };
            return m
        }
    }, rv = ev(function() {
        return !0
    }, function(t) {
        var n, e = NaN, r = NaN, i = NaN;
        return {
            lineStart: function() {
                t.lineStart(),
                    n = 1
            },
            point: function(o, u) {
                var a = o > 0 ? fd : -fd
                    , c = _d(o - e);
                _d(c - fd) < sd ? (t.point(e, r = (r + u) / 2 > 0 ? ld : -ld),
                    t.point(i, r),
                    t.lineEnd(),
                    t.lineStart(),
                    t.point(a, r),
                    t.point(o, r),
                    n = 0) : i !== a && c >= fd && (_d(e - i) < sd && (e -= i * sd),
                _d(o - a) < sd && (o -= a * sd),
                    r = Hr(e, r, o, u),
                    t.point(i, r),
                    t.lineEnd(),
                    t.lineStart(),
                    t.point(a, r),
                    n = 0),
                    t.point(e = o, r = u),
                    i = a
            },
            lineEnd: function() {
                t.lineEnd(),
                    e = r = NaN
            },
            clean: function() {
                return 2 - n
            }
        }
    }, function(t, n, e, r) {
        var i;
        if (null == t)
            i = e * ld,
                r.point(-fd, i),
                r.point(0, i),
                r.point(fd, i),
                r.point(fd, 0),
                r.point(fd, -i),
                r.point(0, -i),
                r.point(-fd, -i),
                r.point(-fd, 0),
                r.point(-fd, i);
        else if (_d(t[0] - n[0]) > sd) {
            var o = t[0] < n[0] ? fd : -fd;
            i = e * o / 2,
                r.point(-o, i),
                r.point(0, i),
                r.point(o, i)
        } else
            r.point(n[0], n[1])
    }, [-fd, -ld]), iv = function(t) {
        function n(t, n) {
            return md(t) * md(n) > i
        }
        function e(t, n, e) {
            var r = [1, 0, 0]
                , o = sr(ar(t), ar(n))
                , u = cr(o, o)
                , a = o[0]
                , c = u - a * a;
            if (!c)
                return !e && t;
            var s = i * u / c
                , f = -i * a / c
                , l = sr(r, o)
                , h = lr(r, s);
            fr(h, lr(o, f));
            var p = l
                , d = cr(h, p)
                , v = cr(p, p)
                , _ = d * d - v * (cr(h, h) - 1);
            if (!(_ < 0)) {
                var g = kd(_)
                    , y = lr(p, (-d - g) / v);
                if (fr(y, h),
                        y = ur(y),
                        !e)
                    return y;
                var m, x = t[0], b = n[0], w = t[1], M = n[1];
                b < x && (m = x,
                    x = b,
                    b = m);
                var T = b - x
                    , N = _d(T - fd) < sd
                    , k = N || T < sd;
                if (!N && M < w && (m = w,
                        w = M,
                        M = m),
                        k ? N ? w + M > 0 ^ y[1] < (_d(y[0] - x) < sd ? w : M) : w <= y[1] && y[1] <= M : T > fd ^ (x <= y[0] && y[0] <= b)) {
                    var S = lr(p, (-d + g) / v);
                    return fr(S, h),
                        [y, ur(S)]
                }
            }
        }
        function r(n, e) {
            var r = u ? t : fd - t
                , i = 0;
            return n < -r ? i |= 1 : n > r && (i |= 2),
                e < -r ? i |= 4 : e > r && (i |= 8),
                i
        }
        var i = md(t)
            , o = 6 * vd
            , u = i > 0
            , a = _d(i) > sd;
        return ev(n, function(t) {
            var i, o, c, s, f;
            return {
                lineStart: function() {
                    s = c = !1,
                        f = 1
                },
                point: function(l, h) {
                    var p, d = [l, h], v = n(l, h), _ = u ? v ? 0 : r(l, h) : v ? r(l + (l < 0 ? fd : -fd), h) : 0;
                    if (!i && (s = c = v) && t.lineStart(),
                        v !== c && (!(p = e(i, d)) || Qd(i, p) || Qd(d, p)) && (d[0] += sd,
                            d[1] += sd,
                            v = n(d[0], d[1])),
                        v !== c)
                        f = 0,
                            v ? (t.lineStart(),
                                p = e(d, i),
                                t.point(p[0], p[1])) : (p = e(i, d),
                                t.point(p[0], p[1]),
                                t.lineEnd()),
                            i = p;
                    else if (a && i && u ^ v) {
                        var g;
                        _ & o || !(g = e(d, i, !0)) || (f = 0,
                            u ? (t.lineStart(),
                                t.point(g[0][0], g[0][1]),
                                t.point(g[1][0], g[1][1]),
                                t.lineEnd()) : (t.point(g[1][0], g[1][1]),
                                t.lineEnd(),
                                t.lineStart(),
                                t.point(g[0][0], g[0][1])))
                    }
                    !v || i && Qd(i, d) || t.point(d[0], d[1]),
                        i = d,
                        c = v,
                        o = _
                },
                lineEnd: function() {
                    c && t.lineEnd(),
                        i = null
                },
                clean: function() {
                    return f | (s && c) << 1
                }
            }
        }, function(n, e, r, i) {
            Or(i, t, o, r, n, e)
        }, u ? [0, -t] : [-fd, t - fd])
    }, ov = function(t, n, e, r, i, o) {
        var u, a = t[0], c = t[1], s = 0, f = 1, l = n[0] - a, h = n[1] - c;
        if (u = e - a,
            l || !(u > 0)) {
            if (u /= l,
                l < 0) {
                if (u < s)
                    return;
                u < f && (f = u)
            } else if (l > 0) {
                if (u > f)
                    return;
                u > s && (s = u)
            }
            if (u = i - a,
                l || !(u < 0)) {
                if (u /= l,
                    l < 0) {
                    if (u > f)
                        return;
                    u > s && (s = u)
                } else if (l > 0) {
                    if (u < s)
                        return;
                    u < f && (f = u)
                }
                if (u = r - c,
                    h || !(u > 0)) {
                    if (u /= h,
                        h < 0) {
                        if (u < s)
                            return;
                        u < f && (f = u)
                    } else if (h > 0) {
                        if (u > f)
                            return;
                        u > s && (s = u)
                    }
                    if (u = o - c,
                        h || !(u < 0)) {
                        if (u /= h,
                            h < 0) {
                            if (u > f)
                                return;
                            u > s && (s = u)
                        } else if (h > 0) {
                            if (u < s)
                                return;
                            u < f && (f = u)
                        }
                        return s > 0 && (t[0] = a + s * l,
                            t[1] = c + s * h),
                        f < 1 && (n[0] = a + f * l,
                            n[1] = c + f * h),
                            !0
                    }
                }
            }
        }
    }, uv = 1e9, av = -uv, cv = Cp(), sv = {
        sphere: Qe,
        point: Qe,
        lineStart: function() {
            sv.point = Vr,
                sv.lineEnd = $r
        },
        lineEnd: Qe,
        polygonStart: Qe,
        polygonEnd: Qe
    }, fv = function(t) {
        return cv.reset(),
            Cd(t, sv),
            +cv
    }, lv = [null, null], hv = {
        type: "LineString",
        coordinates: lv
    }, pv = function(t, n) {
        return lv[0] = t,
            lv[1] = n,
            fv(hv)
    }, dv = {
        Feature: function(t, n) {
            return Zr(t.geometry, n)
        },
        FeatureCollection: function(t, n) {
            for (var e = t.features, r = -1, i = e.length; ++r < i; )
                if (Zr(e[r].geometry, n))
                    return !0;
            return !1
        }
    }, vv = {
        Sphere: function() {
            return !0
        },
        Point: function(t, n) {
            return Gr(t.coordinates, n)
        },
        MultiPoint: function(t, n) {
            for (var e = t.coordinates, r = -1, i = e.length; ++r < i; )
                if (Gr(e[r], n))
                    return !0;
            return !1
        },
        LineString: function(t, n) {
            return Jr(t.coordinates, n)
        },
        MultiLineString: function(t, n) {
            for (var e = t.coordinates, r = -1, i = e.length; ++r < i; )
                if (Jr(e[r], n))
                    return !0;
            return !1
        },
        Polygon: function(t, n) {
            return Qr(t.coordinates, n)
        },
        MultiPolygon: function(t, n) {
            for (var e = t.coordinates, r = -1, i = e.length; ++r < i; )
                if (Qr(e[r], n))
                    return !0;
            return !1
        },
        GeometryCollection: function(t, n) {
            for (var e = t.geometries, r = -1, i = e.length; ++r < i; )
                if (Zr(e[r], n))
                    return !0;
            return !1
        }
    }, _v = function(t) {
        return t
    }, gv = Cp(), yv = Cp(), mv = {
        point: Qe,
        lineStart: Qe,
        lineEnd: Qe,
        polygonStart: function() {
            mv.lineStart = ii,
                mv.lineEnd = ai
        },
        polygonEnd: function() {
            mv.lineStart = mv.lineEnd = mv.point = Qe,
                gv.add(_d(yv)),
                yv.reset()
        },
        result: function() {
            var t = gv / 2;
            return gv.reset(),
                t
        }
    }, xv = 1 / 0, bv = xv, wv = -xv, Mv = wv, Tv = {
        point: function(t, n) {
            t < xv && (xv = t),
            t > wv && (wv = t),
            n < bv && (bv = n),
            n > Mv && (Mv = n)
        },
        lineStart: Qe,
        lineEnd: Qe,
        polygonStart: Qe,
        polygonEnd: Qe,
        result: function() {
            var t = [[xv, bv], [wv, Mv]];
            return wv = Mv = -(bv = xv = 1 / 0),
                t
        }
    }, Nv = 0, kv = 0, Sv = 0, Ev = 0, Av = 0, Cv = 0, zv = 0, Pv = 0, Rv = 0, Lv = {
        point: ci,
        lineStart: si,
        lineEnd: hi,
        polygonStart: function() {
            Lv.lineStart = pi,
                Lv.lineEnd = di
        },
        polygonEnd: function() {
            Lv.point = ci,
                Lv.lineStart = si,
                Lv.lineEnd = hi
        },
        result: function() {
            var t = Rv ? [zv / Rv, Pv / Rv] : Cv ? [Ev / Cv, Av / Cv] : Sv ? [Nv / Sv, kv / Sv] : [NaN, NaN];
            return Nv = kv = Sv = Ev = Av = Cv = zv = Pv = Rv = 0,
                t
        }
    };
    gi.prototype = {
        _radius: 4.5,
        pointRadius: function(t) {
            return this._radius = t,
                this
        },
        polygonStart: function() {
            this._line = 0
        },
        polygonEnd: function() {
            this._line = NaN
        },
        lineStart: function() {
            this._point = 0
        },
        lineEnd: function() {
            0 === this._line && this._context.closePath(),
                this._point = NaN
        },
        point: function(t, n) {
            switch (this._point) {
                case 0:
                    this._context.moveTo(t, n),
                        this._point = 1;
                    break;
                case 1:
                    this._context.lineTo(t, n);
                    break;
                default:
                    this._context.moveTo(t + this._radius, n),
                        this._context.arc(t, n, this._radius, 0, pd)
            }
        },
        result: Qe
    };
    var qv, Uv, Dv, Ov, Fv, Iv = Cp(), Yv = {
        point: Qe,
        lineStart: function() {
            Yv.point = yi
        },
        lineEnd: function() {
            qv && mi(Uv, Dv),
                Yv.point = Qe
        },
        polygonStart: function() {
            qv = !0
        },
        polygonEnd: function() {
            qv = null
        },
        result: function() {
            var t = +Iv;
            return Iv.reset(),
                t
        }
    };
    xi.prototype = {
        _radius: 4.5,
        _circle: bi(4.5),
        pointRadius: function(t) {
            return (t = +t) !== this._radius && (this._radius = t,
                this._circle = null),
                this
        },
        polygonStart: function() {
            this._line = 0
        },
        polygonEnd: function() {
            this._line = NaN
        },
        lineStart: function() {
            this._point = 0
        },
        lineEnd: function() {
            0 === this._line && this._string.push("Z"),
                this._point = NaN
        },
        point: function(t, n) {
            switch (this._point) {
                case 0:
                    this._string.push("M", t, ",", n),
                        this._point = 1;
                    break;
                case 1:
                    this._string.push("L", t, ",", n);
                    break;
                default:
                    null == this._circle && (this._circle = bi(this._radius)),
                        this._string.push("M", t, ",", n, this._circle)
            }
        },
        result: function() {
            if (this._string.length) {
                var t = this._string.join("");
                return this._string = [],
                    t
            }
            return null
        }
    };
    Mi.prototype = {
        constructor: Mi,
        point: function(t, n) {
            this.stream.point(t, n)
        },
        sphere: function() {
            this.stream.sphere()
        },
        lineStart: function() {
            this.stream.lineStart()
        },
        lineEnd: function() {
            this.stream.lineEnd()
        },
        polygonStart: function() {
            this.stream.polygonStart()
        },
        polygonEnd: function() {
            this.stream.polygonEnd()
        }
    };
    var Bv = 16
        , jv = md(30 * vd)
        , Hv = function(t, n) {
        return +n ? Si(t, n) : ki(t)
    }
        , Xv = wi({
        point: function(t, n) {
            this.stream.point(t * vd, n * vd)
        }
    })
        , $v = function() {
        return zi(Ri).scale(155.424).center([0, 33.6442])
    }
        , Vv = function() {
        return $v().parallels([29.5, 45.5]).scale(1070).translate([480, 250]).rotate([96, 0]).center([-.6, 38.7])
    }
        , Wv = qi(function(t) {
        return kd(2 / (1 + t))
    });
    Wv.invert = Ui(function(t) {
        return 2 * Ge(t / 2)
    });
    var Zv = qi(function(t) {
        return (t = Ze(t)) && t / Td(t)
    });
    Zv.invert = Ui(function(t) {
        return t
    });
    Di.invert = function(t, n) {
        return [t, 2 * gd(bd(n)) - ld]
    }
    ;
    Yi.invert = Yi;
    ji.invert = Ui(gd);
    Xi.invert = function(t, n) {
        var e, r = n, i = 25;
        do {
            var o = r * r
                , u = o * o;
            r -= e = (r * (1.007226 + o * (.015085 + u * (.028874 * o - .044475 - .005916 * u))) - n) / (1.007226 + o * (.045255 + u * (.259866 * o - .311325 - .005916 * 11 * u)))
        } while (_d(e) > sd && --i > 0);return [t / (.8707 + (o = r * r) * (o * (o * o * o * (.003971 - .001529 * o) - .013791) - .131979)), r]
    }
    ;
    $i.invert = Ui(Ge);
    Vi.invert = Ui(function(t) {
        return 2 * gd(t)
    });
    Wi.invert = function(t, n) {
        return [-n, 2 * gd(bd(t)) - ld]
    }
    ;
    co.prototype = io.prototype = {
        constructor: co,
        count: function() {
            return this.eachAfter(eo)
        },
        each: function(t) {
            var n, e, r, i, o = this, u = [o];
            do {
                for (n = u.reverse(),
                         u = []; o = n.pop(); )
                    if (t(o),
                            e = o.children)
                        for (r = 0,
                                 i = e.length; r < i; ++r)
                            u.push(e[r])
            } while (u.length);return this
        },
        eachAfter: function(t) {
            for (var n, e, r, i = this, o = [i], u = []; i = o.pop(); )
                if (u.push(i),
                        n = i.children)
                    for (e = 0,
                             r = n.length; e < r; ++e)
                        o.push(n[e]);
            for (; i = u.pop(); )
                t(i);
            return this
        },
        eachBefore: function(t) {
            for (var n, e, r = this, i = [r]; r = i.pop(); )
                if (t(r),
                        n = r.children)
                    for (e = n.length - 1; e >= 0; --e)
                        i.push(n[e]);
            return this
        },
        sum: function(t) {
            return this.eachAfter(function(n) {
                for (var e = +t(n.data) || 0, r = n.children, i = r && r.length; --i >= 0; )
                    e += r[i].value;
                n.value = e
            })
        },
        sort: function(t) {
            return this.eachBefore(function(n) {
                n.children && n.children.sort(t)
            })
        },
        path: function(t) {
            for (var n = this, e = ro(n, t), r = [n]; n !== e; )
                n = n.parent,
                    r.push(n);
            for (var i = r.length; t !== e; )
                r.splice(i, 0, t),
                    t = t.parent;
            return r
        },
        ancestors: function() {
            for (var t = this, n = [t]; t = t.parent; )
                n.push(t);
            return n
        },
        descendants: function() {
            var t = [];
            return this.each(function(n) {
                t.push(n)
            }),
                t
        },
        leaves: function() {
            var t = [];
            return this.eachBefore(function(n) {
                n.children || t.push(n)
            }),
                t
        },
        links: function() {
            var t = this
                , n = [];
            return t.each(function(e) {
                e !== t && n.push({
                    source: e.parent,
                    target: e
                })
            }),
                n
        },
        copy: function() {
            return io(this).eachBefore(uo)
        }
    };
    var Gv = Array.prototype.slice
        , Jv = function(t) {
        for (var n, e, r = 0, i = (t = so(Gv.call(t))).length, o = []; r < i; )
            n = t[r],
                e && ho(e, n) ? ++r : (e = vo(o = fo(o, n)),
                    r = 0);
        return e
    }
        , Qv = function(t) {
        return function() {
            return t
        }
    }
        , Kv = function(t) {
        t.x0 = Math.round(t.x0),
            t.y0 = Math.round(t.y0),
            t.x1 = Math.round(t.x1),
            t.y1 = Math.round(t.y1)
    }
        , t_ = function(t, n, e, r, i) {
        for (var o, u = t.children, a = -1, c = u.length, s = t.value && (r - n) / t.value; ++a < c; )
            (o = u[a]).y0 = e,
                o.y1 = i,
                o.x0 = n,
                o.x1 = n += o.value * s
    }
        , n_ = "$"
        , e_ = {
        depth: -1
    }
        , r_ = {};
    Fo.prototype = Object.create(co.prototype);
    var i_ = function(t, n, e, r, i) {
        for (var o, u = t.children, a = -1, c = u.length, s = t.value && (i - e) / t.value; ++a < c; )
            (o = u[a]).x0 = n,
                o.x1 = r,
                o.y0 = e,
                o.y1 = e += o.value * s
    }
        , o_ = (1 + Math.sqrt(5)) / 2
        , u_ = function t(n) {
        function e(t, e, r, i, o) {
            Yo(n, t, e, r, i, o)
        }
        return e.ratio = function(n) {
            return t((n = +n) > 1 ? n : 1)
        }
            ,
            e
    }(o_)
        , a_ = function t(n) {
        function e(t, e, r, i, o) {
            if ((u = t._squarify) && u.ratio === n)
                for (var u, a, c, s, f, l = -1, h = u.length, p = t.value; ++l < h; ) {
                    for (c = (a = u[l]).children,
                             s = a.value = 0,
                             f = c.length; s < f; ++s)
                        a.value += c[s].value;
                    a.dice ? t_(a, e, r, i, r += (o - r) * a.value / p) : i_(a, e, r, e += (i - e) * a.value / p, o),
                        p -= a.value
                }
            else
                t._squarify = u = Yo(n, t, e, r, i, o),
                    u.ratio = n
        }
        return e.ratio = function(n) {
            return t((n = +n) > 1 ? n : 1)
        }
            ,
            e
    }(o_)
        , c_ = function(t, n, e) {
        return (n[0] - t[0]) * (e[1] - t[1]) - (n[1] - t[1]) * (e[0] - t[0])
    }
        , s_ = [].slice
        , f_ = {};
    Ho.prototype = Go.prototype = {
        constructor: Ho,
        defer: function(t) {
            if ("function" != typeof t)
                throw new Error("invalid callback");
            if (this._call)
                throw new Error("defer after await");
            if (null != this._error)
                return this;
            var n = s_.call(arguments, 1);
            return n.push(t),
                ++this._waiting,
                this._tasks.push(n),
                Xo(this),
                this
        },
        abort: function() {
            return null == this._error && Wo(this, new Error("abort")),
                this
        },
        await: function(t) {
            if ("function" != typeof t)
                throw new Error("invalid callback");
            if (this._call)
                throw new Error("multiple await");
            return this._call = function(n, e) {
                t.apply(null, [n].concat(e))
            }
                ,
                Zo(this),
                this
        },
        awaitAll: function(t) {
            if ("function" != typeof t)
                throw new Error("invalid callback");
            if (this._call)
                throw new Error("multiple await");
            return this._call = t,
                Zo(this),
                this
        }
    };
    var l_ = function() {
        return Math.random()
    }
        , h_ = function t(n) {
        function e(t, e) {
            return t = null == t ? 0 : +t,
                e = null == e ? 1 : +e,
                1 === arguments.length ? (e = t,
                    t = 0) : e -= t,
                function() {
                    return n() * e + t
                }
        }
        return e.source = t,
            e
    }(l_)
        , p_ = function t(n) {
        function e(t, e) {
            var r, i;
            return t = null == t ? 0 : +t,
                e = null == e ? 1 : +e,
                function() {
                    var o;
                    if (null != r)
                        o = r,
                            r = null;
                    else
                        do {
                            r = 2 * n() - 1,
                                o = 2 * n() - 1,
                                i = r * r + o * o
                        } while (!i || i > 1);return t + e * o * Math.sqrt(-2 * Math.log(i) / i)
                }
        }
        return e.source = t,
            e
    }(l_)
        , d_ = function t(n) {
        function e() {
            var t = p_.source(n).apply(this, arguments);
            return function() {
                return Math.exp(t())
            }
        }
        return e.source = t,
            e
    }(l_)
        , v_ = function t(n) {
        function e(t) {
            return function() {
                for (var e = 0, r = 0; r < t; ++r)
                    e += n();
                return e
            }
        }
        return e.source = t,
            e
    }(l_)
        , __ = function t(n) {
        function e(t) {
            var e = v_.source(n)(t);
            return function() {
                return e() / t
            }
        }
        return e.source = t,
            e
    }(l_)
        , g_ = function t(n) {
        function e(t) {
            return function() {
                return -Math.log(1 - n()) / t
            }
        }
        return e.source = t,
            e
    }(l_)
        , y_ = function(t, n) {
        function e(t) {
            var n, e = s.status;
            if (!e && Qo(s) || e >= 200 && e < 300 || 304 === e) {
                if (o)
                    try {
                        n = o.call(r, s)
                    } catch (t) {
                        return void a.call("error", r, t)
                    }
                else
                    n = s;
                a.call("load", r, n)
            } else
                a.call("error", r, t)
        }
        var r, i, o, u, a = h("beforesend", "progress", "load", "error"), c = we(), s = new XMLHttpRequest, f = null, l = null, p = 0;
        if ("undefined" == typeof XDomainRequest || "withCredentials"in s || !/^(http(s)?:)?\/\//.test(t) || (s = new XDomainRequest),
                "onload"in s ? s.onload = s.onerror = s.ontimeout = e : s.onreadystatechange = function(t) {
                    s.readyState > 3 && e(t)
                }
                ,
                s.onprogress = function(t) {
                    a.call("progress", r, t)
                }
                ,
                r = {
                    header: function(t, n) {
                        return t = (t + "").toLowerCase(),
                            arguments.length < 2 ? c.get(t) : (null == n ? c.remove(t) : c.set(t, n + ""),
                                r)
                    },
                    mimeType: function(t) {
                        return arguments.length ? (i = null == t ? null : t + "",
                            r) : i
                    },
                    responseType: function(t) {
                        return arguments.length ? (u = t,
                            r) : u
                    },
                    timeout: function(t) {
                        return arguments.length ? (p = +t,
                            r) : p
                    },
                    user: function(t) {
                        return arguments.length < 1 ? f : (f = null == t ? null : t + "",
                            r)
                    },
                    password: function(t) {
                        return arguments.length < 1 ? l : (l = null == t ? null : t + "",
                            r)
                    },
                    response: function(t) {
                        return o = t,
                            r
                    },
                    get: function(t, n) {
                        return r.send("GET", t, n)
                    },
                    post: function(t, n) {
                        return r.send("POST", t, n)
                    },
                    send: function(n, e, o) {
                        return s.open(n, t, !0, f, l),
                        null == i || c.has("accept") || c.set("accept", i + ",*/*"),
                        s.setRequestHeader && c.each(function(t, n) {
                            s.setRequestHeader(n, t)
                        }),
                        null != i && s.overrideMimeType && s.overrideMimeType(i),
                        null != u && (s.responseType = u),
                        p > 0 && (s.timeout = p),
                        null == o && "function" == typeof e && (o = e,
                            e = null),
                        null != o && 1 === o.length && (o = Jo(o)),
                        null != o && r.on("error", o).on("load", function(t) {
                            o(null, t)
                        }),
                            a.call("beforesend", r, s),
                            s.send(null == e ? null : e),
                            r
                    },
                    abort: function() {
                        return s.abort(),
                            r
                    },
                    on: function() {
                        var t = a.on.apply(a, arguments);
                        return t === a ? r : t
                    }
                },
            null != n) {
            if ("function" != typeof n)
                throw new Error("invalid callback: " + n);
            return r.get(n)
        }
        return r
    }
        , m_ = function(t, n) {
        return function(e, r) {
            var i = y_(e).mimeType(t).response(n);
            if (null != r) {
                if ("function" != typeof r)
                    throw new Error("invalid callback: " + r);
                return i.get(r)
            }
            return i
        }
    }
        , x_ = m_("text/html", function(t) {
        return document.createRange().createContextualFragment(t.responseText)
    })
        , b_ = m_("application/json", function(t) {
        return JSON.parse(t.responseText)
    })
        , w_ = m_("text/plain", function(t) {
        return t.responseText
    })
        , M_ = m_("application/xml", function(t) {
        var n = t.responseXML;
        if (!n)
            throw new Error("parse error");
        return n
    })
        , T_ = function(t, n) {
        return function(e, r, i) {
            arguments.length < 3 && (i = r,
                r = null);
            var o = y_(e).mimeType(t);
            return o.row = function(t) {
                return arguments.length ? o.response(Ko(n, r = t)) : r
            }
                ,
                o.row(r),
                i ? o.get(i) : o
        }
    }
        , N_ = T_("text/csv", tp)
        , k_ = T_("text/tab-separated-values", op)
        , S_ = Array.prototype
        , E_ = S_.map
        , A_ = S_.slice
        , C_ = {
        name: "implicit"
    }
        , z_ = function(t) {
        return function() {
            return t
        }
    }
        , P_ = function(t) {
        return +t
    }
        , R_ = [0, 1]
        , L_ = function(n, e, r) {
        var o, u = n[0], a = n[n.length - 1], c = i(u, a, null == e ? 10 : e);
        switch ((r = He(null == r ? ",f" : r)).type) {
            case "s":
                var s = Math.max(Math.abs(u), Math.abs(a));
                return null != r.precision || isNaN(o = Ep(c, s)) || (r.precision = o),
                    t.formatPrefix(r, s);
            case "":
            case "e":
            case "g":
            case "p":
            case "r":
                null != r.precision || isNaN(o = Ap(c, Math.max(Math.abs(u), Math.abs(a)))) || (r.precision = o - ("e" === r.type));
                break;
            case "f":
            case "%":
                null != r.precision || isNaN(o = Sp(c)) || (r.precision = o - 2 * ("%" === r.type))
        }
        return t.format(r)
    }
        , q_ = function(t, n) {
        var e, r = 0, i = (t = t.slice()).length - 1, o = t[r], u = t[i];
        return u < o && (e = r,
            r = i,
            i = e,
            e = o,
            o = u,
            u = e),
            t[r] = n.floor(o),
            t[i] = n.ceil(u),
            t
    }
        , U_ = new Date
        , D_ = new Date
        , O_ = Nu(function() {}, function(t, n) {
        t.setTime(+t + n)
    }, function(t, n) {
        return n - t
    });
    O_.every = function(t) {
        return t = Math.floor(t),
            isFinite(t) && t > 0 ? t > 1 ? Nu(function(n) {
                n.setTime(Math.floor(n / t) * t)
            }, function(n, e) {
                n.setTime(+n + e * t)
            }, function(n, e) {
                return (e - n) / t
            }) : O_ : null
    }
    ;
    var F_ = O_.range
        , I_ = 6e4
        , Y_ = 6048e5
        , B_ = Nu(function(t) {
        t.setTime(1e3 * Math.floor(t / 1e3))
    }, function(t, n) {
        t.setTime(+t + 1e3 * n)
    }, function(t, n) {
        return (n - t) / 1e3
    }, function(t) {
        return t.getUTCSeconds()
    })
        , j_ = B_.range
        , H_ = Nu(function(t) {
        t.setTime(Math.floor(t / I_) * I_)
    }, function(t, n) {
        t.setTime(+t + n * I_)
    }, function(t, n) {
        return (n - t) / I_
    }, function(t) {
        return t.getMinutes()
    })
        , X_ = H_.range
        , $_ = Nu(function(t) {
        var n = t.getTimezoneOffset() * I_ % 36e5;
        n < 0 && (n += 36e5),
            t.setTime(36e5 * Math.floor((+t - n) / 36e5) + n)
    }, function(t, n) {
        t.setTime(+t + 36e5 * n)
    }, function(t, n) {
        return (n - t) / 36e5
    }, function(t) {
        return t.getHours()
    })
        , V_ = $_.range
        , W_ = Nu(function(t) {
        t.setHours(0, 0, 0, 0)
    }, function(t, n) {
        t.setDate(t.getDate() + n)
    }, function(t, n) {
        return (n - t - (n.getTimezoneOffset() - t.getTimezoneOffset()) * I_) / 864e5
    }, function(t) {
        return t.getDate() - 1
    })
        , Z_ = W_.range
        , G_ = ku(0)
        , J_ = ku(1)
        , Q_ = ku(2)
        , K_ = ku(3)
        , tg = ku(4)
        , ng = ku(5)
        , eg = ku(6)
        , rg = G_.range
        , ig = J_.range
        , og = Q_.range
        , ug = K_.range
        , ag = tg.range
        , cg = ng.range
        , sg = eg.range
        , fg = Nu(function(t) {
        t.setDate(1),
            t.setHours(0, 0, 0, 0)
    }, function(t, n) {
        t.setMonth(t.getMonth() + n)
    }, function(t, n) {
        return n.getMonth() - t.getMonth() + 12 * (n.getFullYear() - t.getFullYear())
    }, function(t) {
        return t.getMonth()
    })
        , lg = fg.range
        , hg = Nu(function(t) {
        t.setMonth(0, 1),
            t.setHours(0, 0, 0, 0)
    }, function(t, n) {
        t.setFullYear(t.getFullYear() + n)
    }, function(t, n) {
        return n.getFullYear() - t.getFullYear()
    }, function(t) {
        return t.getFullYear()
    });
    hg.every = function(t) {
        return isFinite(t = Math.floor(t)) && t > 0 ? Nu(function(n) {
            n.setFullYear(Math.floor(n.getFullYear() / t) * t),
                n.setMonth(0, 1),
                n.setHours(0, 0, 0, 0)
        }, function(n, e) {
            n.setFullYear(n.getFullYear() + e * t)
        }) : null
    }
    ;
    var pg = hg.range
        , dg = Nu(function(t) {
        t.setUTCSeconds(0, 0)
    }, function(t, n) {
        t.setTime(+t + n * I_)
    }, function(t, n) {
        return (n - t) / I_
    }, function(t) {
        return t.getUTCMinutes()
    })
        , vg = dg.range
        , _g = Nu(function(t) {
        t.setUTCMinutes(0, 0, 0)
    }, function(t, n) {
        t.setTime(+t + 36e5 * n)
    }, function(t, n) {
        return (n - t) / 36e5
    }, function(t) {
        return t.getUTCHours()
    })
        , gg = _g.range
        , yg = Nu(function(t) {
        t.setUTCHours(0, 0, 0, 0)
    }, function(t, n) {
        t.setUTCDate(t.getUTCDate() + n)
    }, function(t, n) {
        return (n - t) / 864e5
    }, function(t) {
        return t.getUTCDate() - 1
    })
        , mg = yg.range
        , xg = Su(0)
        , bg = Su(1)
        , wg = Su(2)
        , Mg = Su(3)
        , Tg = Su(4)
        , Ng = Su(5)
        , kg = Su(6)
        , Sg = xg.range
        , Eg = bg.range
        , Ag = wg.range
        , Cg = Mg.range
        , zg = Tg.range
        , Pg = Ng.range
        , Rg = kg.range
        , Lg = Nu(function(t) {
        t.setUTCDate(1),
            t.setUTCHours(0, 0, 0, 0)
    }, function(t, n) {
        t.setUTCMonth(t.getUTCMonth() + n)
    }, function(t, n) {
        return n.getUTCMonth() - t.getUTCMonth() + 12 * (n.getUTCFullYear() - t.getUTCFullYear())
    }, function(t) {
        return t.getUTCMonth()
    })
        , qg = Lg.range
        , Ug = Nu(function(t) {
        t.setUTCMonth(0, 1),
            t.setUTCHours(0, 0, 0, 0)
    }, function(t, n) {
        t.setUTCFullYear(t.getUTCFullYear() + n)
    }, function(t, n) {
        return n.getUTCFullYear() - t.getUTCFullYear()
    }, function(t) {
        return t.getUTCFullYear()
    });
    Ug.every = function(t) {
        return isFinite(t = Math.floor(t)) && t > 0 ? Nu(function(n) {
            n.setUTCFullYear(Math.floor(n.getUTCFullYear() / t) * t),
                n.setUTCMonth(0, 1),
                n.setUTCHours(0, 0, 0, 0)
        }, function(n, e) {
            n.setUTCFullYear(n.getUTCFullYear() + e * t)
        }) : null
    }
    ;
    var Dg, Og = Ug.range, Fg = {
        "-": "",
        _: " ",
        0: "0"
    }, Ig = /^\s*\d+/, Yg = /^%/, Bg = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;
    Na({
        dateTime: "%x, %X",
        date: "%-m/%-d/%Y",
        time: "%-I:%M:%S %p",
        periods: ["AM", "PM"],
        days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
        shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
        months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
        shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
    });
    var jg = Date.prototype.toISOString ? function(t) {
            return t.toISOString()
        }
        : t.utcFormat("%Y-%m-%dT%H:%M:%S.%LZ")
        , Hg = +new Date("2000-01-01T00:00:00.000Z") ? function(t) {
            var n = new Date(t);
            return isNaN(n) ? null : n
        }
        : t.utcParse("%Y-%m-%dT%H:%M:%S.%LZ")
        , Xg = 1e3
        , $g = 60 * Xg
        , Vg = 60 * $g
        , Wg = 24 * Vg
        , Zg = 7 * Wg
        , Gg = 30 * Wg
        , Jg = 365 * Wg
        , Qg = function(t) {
        return t.match(/.{6}/g).map(function(t) {
            return "#" + t
        })
    }
        , Kg = Qg("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf")
        , ty = Qg("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6")
        , ny = Qg("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9")
        , ey = Qg("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5")
        , ry = Tl($t(300, .5, 0), $t(-240, .5, 1))
        , iy = Tl($t(-100, .75, .35), $t(80, 1.5, .8))
        , oy = Tl($t(260, .75, .35), $t(80, 1.5, .8))
        , uy = $t()
        , ay = Aa(Qg("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"))
        , cy = Aa(Qg("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"))
        , sy = Aa(Qg("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"))
        , fy = Aa(Qg("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"))
        , ly = function(t) {
        return function() {
            return t
        }
    }
        , hy = Math.abs
        , py = Math.atan2
        , dy = Math.cos
        , vy = Math.max
        , _y = Math.min
        , gy = Math.sin
        , yy = Math.sqrt
        , my = 1e-12
        , xy = Math.PI
        , by = xy / 2
        , wy = 2 * xy;
    Ia.prototype = {
        areaStart: function() {
            this._line = 0
        },
        areaEnd: function() {
            this._line = NaN
        },
        lineStart: function() {
            this._point = 0
        },
        lineEnd: function() {
            (this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(),
                this._line = 1 - this._line
        },
        point: function(t, n) {
            switch (t = +t,
                n = +n,
                this._point) {
                case 0:
                    this._point = 1,
                        this._line ? this._context.lineTo(t, n) : this._context.moveTo(t, n);
                    break;
                case 1:
                    this._point = 2;
                default:
                    this._context.lineTo(t, n)
            }
        }
    };
    var My = function(t) {
        return new Ia(t)
    }
        , Ty = function() {
        function t(t) {
            var a, c, s, f = t.length, l = !1;
            for (null == i && (u = o(s = ve())),
                     a = 0; a <= f; ++a)
                !(a < f && r(c = t[a], a, t)) === l && ((l = !l) ? u.lineStart() : u.lineEnd()),
                l && u.point(+n(c, a, t), +e(c, a, t));
            if (s)
                return u = null,
                s + "" || null
        }
        var n = Ya
            , e = Ba
            , r = ly(!0)
            , i = null
            , o = My
            , u = null;
        return t.x = function(e) {
            return arguments.length ? (n = "function" == typeof e ? e : ly(+e),
                t) : n
        }
            ,
            t.y = function(n) {
                return arguments.length ? (e = "function" == typeof n ? n : ly(+n),
                    t) : e
            }
            ,
            t.defined = function(n) {
                return arguments.length ? (r = "function" == typeof n ? n : ly(!!n),
                    t) : r
            }
            ,
            t.curve = function(n) {
                return arguments.length ? (o = n,
                null != i && (u = o(i)),
                    t) : o
            }
            ,
            t.context = function(n) {
                return arguments.length ? (null == n ? i = u = null : u = o(i = n),
                    t) : i
            }
            ,
            t
    }
        , Ny = function() {
        function t(t) {
            var n, f, l, h, p, d = t.length, v = !1, _ = new Array(d), g = new Array(d);
            for (null == a && (s = c(p = ve())),
                     n = 0; n <= d; ++n) {
                if (!(n < d && u(h = t[n], n, t)) === v)
                    if (v = !v)
                        f = n,
                            s.areaStart(),
                            s.lineStart();
                    else {
                        for (s.lineEnd(),
                                 s.lineStart(),
                                 l = n - 1; l >= f; --l)
                            s.point(_[l], g[l]);
                        s.lineEnd(),
                            s.areaEnd()
                    }
                v && (_[n] = +e(h, n, t),
                    g[n] = +i(h, n, t),
                    s.point(r ? +r(h, n, t) : _[n], o ? +o(h, n, t) : g[n]))
            }
            if (p)
                return s = null,
                p + "" || null
        }
        function n() {
            return Ty().defined(u).curve(c).context(a)
        }
        var e = Ya
            , r = null
            , i = ly(0)
            , o = Ba
            , u = ly(!0)
            , a = null
            , c = My
            , s = null;
        return t.x = function(n) {
            return arguments.length ? (e = "function" == typeof n ? n : ly(+n),
                r = null,
                t) : e
        }
            ,
            t.x0 = function(n) {
                return arguments.length ? (e = "function" == typeof n ? n : ly(+n),
                    t) : e
            }
            ,
            t.x1 = function(n) {
                return arguments.length ? (r = null == n ? null : "function" == typeof n ? n : ly(+n),
                    t) : r
            }
            ,
            t.y = function(n) {
                return arguments.length ? (i = "function" == typeof n ? n : ly(+n),
                    o = null,
                    t) : i
            }
            ,
            t.y0 = function(n) {
                return arguments.length ? (i = "function" == typeof n ? n : ly(+n),
                    t) : i
            }
            ,
            t.y1 = function(n) {
                return arguments.length ? (o = null == n ? null : "function" == typeof n ? n : ly(+n),
                    t) : o
            }
            ,
            t.lineX0 = t.lineY0 = function() {
                return n().x(e).y(i)
            }
            ,
            t.lineY1 = function() {
                return n().x(e).y(o)
            }
            ,
            t.lineX1 = function() {
                return n().x(r).y(i)
            }
            ,
            t.defined = function(n) {
                return arguments.length ? (u = "function" == typeof n ? n : ly(!!n),
                    t) : u
            }
            ,
            t.curve = function(n) {
                return arguments.length ? (c = n,
                null != a && (s = c(a)),
                    t) : c
            }
            ,
            t.context = function(n) {
                return arguments.length ? (null == n ? a = s = null : s = c(a = n),
                    t) : a
            }
            ,
            t
    }
        , ky = function(t, n) {
        return n < t ? -1 : n > t ? 1 : n >= t ? 0 : NaN
    }
        , Sy = function(t) {
        return t
    }
        , Ey = Ha(My);
    ja.prototype = {
        areaStart: function() {
            this._curve.areaStart()
        },
        areaEnd: function() {
            this._curve.areaEnd()
        },
        lineStart: function() {
            this._curve.lineStart()
        },
        lineEnd: function() {
            this._curve.lineEnd()
        },
        point: function(t, n) {
            this._curve.point(n * Math.sin(t), n * -Math.cos(t))
        }
    };
    var Ay = function() {
        return Xa(Ty().curve(Ey))
    }
        , Cy = function() {
        var t = Ny().curve(Ey)
            , n = t.curve
            , e = t.lineX0
            , r = t.lineX1
            , i = t.lineY0
            , o = t.lineY1;
        return t.angle = t.x,
            delete t.x,
            t.startAngle = t.x0,
            delete t.x0,
            t.endAngle = t.x1,
            delete t.x1,
            t.radius = t.y,
            delete t.y,
            t.innerRadius = t.y0,
            delete t.y0,
            t.outerRadius = t.y1,
            delete t.y1,
            t.lineStartAngle = function() {
                return Xa(e())
            }
            ,
            delete t.lineX0,
            t.lineEndAngle = function() {
                return Xa(r())
            }
            ,
            delete t.lineX1,
            t.lineInnerRadius = function() {
                return Xa(i())
            }
            ,
            delete t.lineY0,
            t.lineOuterRadius = function() {
                return Xa(o())
            }
            ,
            delete t.lineY1,
            t.curve = function(t) {
                return arguments.length ? n(Ha(t)) : n()._curve
            }
            ,
            t
    }
        , zy = function(t, n) {
        return [(n = +n) * Math.cos(t -= Math.PI / 2), n * Math.sin(t)]
    }
        , Py = Array.prototype.slice
        , Ry = {
        draw: function(t, n) {
            var e = Math.sqrt(n / xy);
            t.moveTo(e, 0),
                t.arc(0, 0, e, 0, wy)
        }
    }
        , Ly = {
        draw: function(t, n) {
            var e = Math.sqrt(n / 5) / 2;
            t.moveTo(-3 * e, -e),
                t.lineTo(-e, -e),
                t.lineTo(-e, -3 * e),
                t.lineTo(e, -3 * e),
                t.lineTo(e, -e),
                t.lineTo(3 * e, -e),
                t.lineTo(3 * e, e),
                t.lineTo(e, e),
                t.lineTo(e, 3 * e),
                t.lineTo(-e, 3 * e),
                t.lineTo(-e, e),
                t.lineTo(-3 * e, e),
                t.closePath()
        }
    }
        , qy = Math.sqrt(1 / 3)
        , Uy = 2 * qy
        , Dy = {
        draw: function(t, n) {
            var e = Math.sqrt(n / Uy)
                , r = e * qy;
            t.moveTo(0, -e),
                t.lineTo(r, 0),
                t.lineTo(0, e),
                t.lineTo(-r, 0),
                t.closePath()
        }
    }
        , Oy = Math.sin(xy / 10) / Math.sin(7 * xy / 10)
        , Fy = Math.sin(wy / 10) * Oy
        , Iy = -Math.cos(wy / 10) * Oy
        , Yy = {
        draw: function(t, n) {
            var e = Math.sqrt(.8908130915292852 * n)
                , r = Fy * e
                , i = Iy * e;
            t.moveTo(0, -e),
                t.lineTo(r, i);
            for (var o = 1; o < 5; ++o) {
                var u = wy * o / 5
                    , a = Math.cos(u)
                    , c = Math.sin(u);
                t.lineTo(c * e, -a * e),
                    t.lineTo(a * r - c * i, c * r + a * i)
            }
            t.closePath()
        }
    }
        , By = {
        draw: function(t, n) {
            var e = Math.sqrt(n)
                , r = -e / 2;
            t.rect(r, r, e, e)
        }
    }
        , jy = Math.sqrt(3)
        , Hy = {
        draw: function(t, n) {
            var e = -Math.sqrt(n / (3 * jy));
            t.moveTo(0, 2 * e),
                t.lineTo(-jy * e, -e),
                t.lineTo(jy * e, -e),
                t.closePath()
        }
    }
        , Xy = -.5
        , $y = Math.sqrt(3) / 2
        , Vy = 1 / Math.sqrt(12)
        , Wy = 3 * (Vy / 2 + 1)
        , Zy = {
        draw: function(t, n) {
            var e = Math.sqrt(n / Wy)
                , r = e / 2
                , i = e * Vy
                , o = r
                , u = e * Vy + e
                , a = -o
                , c = u;
            t.moveTo(r, i),
                t.lineTo(o, u),
                t.lineTo(a, c),
                t.lineTo(Xy * r - $y * i, $y * r + Xy * i),
                t.lineTo(Xy * o - $y * u, $y * o + Xy * u),
                t.lineTo(Xy * a - $y * c, $y * a + Xy * c),
                t.lineTo(Xy * r + $y * i, Xy * i - $y * r),
                t.lineTo(Xy * o + $y * u, Xy * u - $y * o),
                t.lineTo(Xy * a + $y * c, Xy * c - $y * a),
                t.closePath()
        }
    }
        , Gy = [Ry, Ly, Dy, By, Yy, Hy, Zy]
        , Jy = function() {};
    Ka.prototype = {
        areaStart: function() {
            this._line = 0
        },
        areaEnd: function() {
            this._line = NaN
        },
        lineStart: function() {
            this._x0 = this._x1 = this._y0 = this._y1 = NaN,
                this._point = 0
        },
        lineEnd: function() {
            switch (this._point) {
                case 3:
                    Qa(this, this._x1, this._y1);
                case 2:
                    this._context.lineTo(this._x1, this._y1)
            }
            (this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(),
                this._line = 1 - this._line
        },
        point: function(t, n) {
            switch (t = +t,
                n = +n,
                this._point) {
                case 0:
                    this._point = 1,
                        this._line ? this._context.lineTo(t, n) : this._context.moveTo(t, n);
                    break;
                case 1:
                    this._point = 2;
                    break;
                case 2:
                    this._point = 3,
                        this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6);
                default:
                    Qa(this, t, n)
            }
            this._x0 = this._x1,
                this._x1 = t,
                this._y0 = this._y1,
                this._y1 = n
        }
    };
    tc.prototype = {
        areaStart: Jy,
        areaEnd: Jy,
        lineStart: function() {
            this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN,
                this._point = 0
        },
        lineEnd: function() {
            switch (this._point) {
                case 1:
                    this._context.moveTo(this._x2, this._y2),
                        this._context.closePath();
                    break;
                case 2:
                    this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3),
                        this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3),
                        this._context.closePath();
                    break;
                case 3:
                    this.point(this._x2, this._y2),
                        this.point(this._x3, this._y3),
                        this.point(this._x4, this._y4)
            }
        },
        point: function(t, n) {
            switch (t = +t,
                n = +n,
                this._point) {
                case 0:
                    this._point = 1,
                        this._x2 = t,
                        this._y2 = n;
                    break;
                case 1:
                    this._point = 2,
                        this._x3 = t,
                        this._y3 = n;
                    break;
                case 2:
                    this._point = 3,
                        this._x4 = t,
                        this._y4 = n,
                        this._context.moveTo((this._x0 + 4 * this._x1 + t) / 6, (this._y0 + 4 * this._y1 + n) / 6);
                    break;
                default:
                    Qa(this, t, n)
            }
            this._x0 = this._x1,
                this._x1 = t,
                this._y0 = this._y1,
                this._y1 = n
        }
    };
    nc.prototype = {
        areaStart: function() {
            this._line = 0
        },
        areaEnd: function() {
            this._line = NaN
        },
        lineStart: function() {
            this._x0 = this._x1 = this._y0 = this._y1 = NaN,
                this._point = 0
        },
        lineEnd: function() {
            (this._line || 0 !== this._line && 3 === this._point) && this._context.closePath(),
                this._line = 1 - this._line
        },
        point: function(t, n) {
            switch (t = +t,
                n = +n,
                this._point) {
                case 0:
                    this._point = 1;
                    break;
                case 1:
                    this._point = 2;
                    break;
                case 2:
                    this._point = 3;
                    var e = (this._x0 + 4 * this._x1 + t) / 6
                        , r = (this._y0 + 4 * this._y1 + n) / 6;
                    this._line ? this._context.lineTo(e, r) : this._context.moveTo(e, r);
                    break;
                case 3:
                    this._point = 4;
                default:
                    Qa(this, t, n)
            }
            this._x0 = this._x1,
                this._x1 = t,
                this._y0 = this._y1,
                this._y1 = n
        }
    };
    ec.prototype = {
        lineStart: function() {
            this._x = [],
                this._y = [],
                this._basis.lineStart()
        },
        lineEnd: function() {
            var t = this._x
                , n = this._y
                , e = t.length - 1;
            if (e > 0)
                for (var r, i = t[0], o = n[0], u = t[e] - i, a = n[e] - o, c = -1; ++c <= e; )
                    r = c / e,
                        this._basis.point(this._beta * t[c] + (1 - this._beta) * (i + r * u), this._beta * n[c] + (1 - this._beta) * (o + r * a));
            this._x = this._y = null,
                this._basis.lineEnd()
        },
        point: function(t, n) {
            this._x.push(+t),
                this._y.push(+n)
        }
    };
    var Qy = function t(n) {
        function e(t) {
            return 1 === n ? new Ka(t) : new ec(t,n)
        }
        return e.beta = function(n) {
            return t(+n)
        }
            ,
            e
    }(.85);
    ic.prototype = {
        areaStart: function() {
            this._line = 0
        },
        areaEnd: function() {
            this._line = NaN
        },
        lineStart: function() {
            this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN,
                this._point = 0
        },
        lineEnd: function() {
            switch (this._point) {
                case 2:
                    this._context.lineTo(this._x2, this._y2);
                    break;
                case 3:
                    rc(this, this._x1, this._y1)
            }
            (this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(),
                this._line = 1 - this._line
        },
        point: function(t, n) {
            switch (t = +t,
                n = +n,
                this._point) {
                case 0:
                    this._point = 1,
                        this._line ? this._context.lineTo(t, n) : this._context.moveTo(t, n);
                    break;
                case 1:
                    this._point = 2,
                        this._x1 = t,
                        this._y1 = n;
                    break;
                case 2:
                    this._point = 3;
                default:
                    rc(this, t, n)
            }
            this._x0 = this._x1,
                this._x1 = this._x2,
                this._x2 = t,
                this._y0 = this._y1,
                this._y1 = this._y2,
                this._y2 = n
        }
    };
    var Ky = function t(n) {
        function e(t) {
            return new ic(t,n)
        }
        return e.tension = function(n) {
            return t(+n)
        }
            ,
            e
    }(0);
    oc.prototype = {
        areaStart: Jy,
        areaEnd: Jy,
        lineStart: function() {
            this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN,
                this._point = 0
        },
        lineEnd: function() {
            switch (this._point) {
                case 1:
                    this._context.moveTo(this._x3, this._y3),
                        this._context.closePath();
                    break;
                case 2:
                    this._context.lineTo(this._x3, this._y3),
                        this._context.closePath();
                    break;
                case 3:
                    this.point(this._x3, this._y3),
                        this.point(this._x4, this._y4),
                        this.point(this._x5, this._y5)
            }
        },
        point: function(t, n) {
            switch (t = +t,
                n = +n,
                this._point) {
                case 0:
                    this._point = 1,
                        this._x3 = t,
                        this._y3 = n;
                    break;
                case 1:
                    this._point = 2,
                        this._context.moveTo(this._x4 = t, this._y4 = n);
                    break;
                case 2:
                    this._point = 3,
                        this._x5 = t,
                        this._y5 = n;
                    break;
                default:
                    rc(this, t, n)
            }
            this._x0 = this._x1,
                this._x1 = this._x2,
                this._x2 = t,
                this._y0 = this._y1,
                this._y1 = this._y2,
                this._y2 = n
        }
    };
    var tm = function t(n) {
        function e(t) {
            return new oc(t,n)
        }
        return e.tension = function(n) {
            return t(+n)
        }
            ,
            e
    }(0);
    uc.prototype = {
        areaStart: function() {
            this._line = 0
        },
        areaEnd: function() {
            this._line = NaN
        },
        lineStart: function() {
            this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN,
                this._point = 0
        },
        lineEnd: function() {
            (this._line || 0 !== this._line && 3 === this._point) && this._context.closePath(),
                this._line = 1 - this._line
        },
        point: function(t, n) {
            switch (t = +t,
                n = +n,
                this._point) {
                case 0:
                    this._point = 1;
                    break;
                case 1:
                    this._point = 2;
                    break;
                case 2:
                    this._point = 3,
                        this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);
                    break;
                case 3:
                    this._point = 4;
                default:
                    rc(this, t, n)
            }
            this._x0 = this._x1,
                this._x1 = this._x2,
                this._x2 = t,
                this._y0 = this._y1,
                this._y1 = this._y2,
                this._y2 = n
        }
    };
    var nm = function t(n) {
        function e(t) {
            return new uc(t,n)
        }
        return e.tension = function(n) {
            return t(+n)
        }
            ,
            e
    }(0);
    cc.prototype = {
        areaStart: function() {
            this._line = 0
        },
        areaEnd: function() {
            this._line = NaN
        },
        lineStart: function() {
            this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN,
                this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0
        },
        lineEnd: function() {
            switch (this._point) {
                case 2:
                    this._context.lineTo(this._x2, this._y2);
                    break;
                case 3:
                    this.point(this._x2, this._y2)
            }
            (this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(),
                this._line = 1 - this._line
        },
        point: function(t, n) {
            if (t = +t,
                    n = +n,
                    this._point) {
                var e = this._x2 - t
                    , r = this._y2 - n;
                this._l23_a = Math.sqrt(this._l23_2a = Math.pow(e * e + r * r, this._alpha))
            }
            switch (this._point) {
                case 0:
                    this._point = 1,
                        this._line ? this._context.lineTo(t, n) : this._context.moveTo(t, n);
                    break;
                case 1:
                    this._point = 2;
                    break;
                case 2:
                    this._point = 3;
                default:
                    ac(this, t, n)
            }
            this._l01_a = this._l12_a,
                this._l12_a = this._l23_a,
                this._l01_2a = this._l12_2a,
                this._l12_2a = this._l23_2a,
                this._x0 = this._x1,
                this._x1 = this._x2,
                this._x2 = t,
                this._y0 = this._y1,
                this._y1 = this._y2,
                this._y2 = n
        }
    };
    var em = function t(n) {
        function e(t) {
            return n ? new cc(t,n) : new ic(t,0)
        }
        return e.alpha = function(n) {
            return t(+n)
        }
            ,
            e
    }(.5);
    sc.prototype = {
        areaStart: Jy,
        areaEnd: Jy,
        lineStart: function() {
            this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN,
                this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0
        },
        lineEnd: function() {
            switch (this._point) {
                case 1:
                    this._context.moveTo(this._x3, this._y3),
                        this._context.closePath();
                    break;
                case 2:
                    this._context.lineTo(this._x3, this._y3),
                        this._context.closePath();
                    break;
                case 3:
                    this.point(this._x3, this._y3),
                        this.point(this._x4, this._y4),
                        this.point(this._x5, this._y5)
            }
        },
        point: function(t, n) {
            if (t = +t,
                    n = +n,
                    this._point) {
                var e = this._x2 - t
                    , r = this._y2 - n;
                this._l23_a = Math.sqrt(this._l23_2a = Math.pow(e * e + r * r, this._alpha))
            }
            switch (this._point) {
                case 0:
                    this._point = 1,
                        this._x3 = t,
                        this._y3 = n;
                    break;
                case 1:
                    this._point = 2,
                        this._context.moveTo(this._x4 = t, this._y4 = n);
                    break;
                case 2:
                    this._point = 3,
                        this._x5 = t,
                        this._y5 = n;
                    break;
                default:
                    ac(this, t, n)
            }
            this._l01_a = this._l12_a,
                this._l12_a = this._l23_a,
                this._l01_2a = this._l12_2a,
                this._l12_2a = this._l23_2a,
                this._x0 = this._x1,
                this._x1 = this._x2,
                this._x2 = t,
                this._y0 = this._y1,
                this._y1 = this._y2,
                this._y2 = n
        }
    };
    var rm = function t(n) {
        function e(t) {
            return n ? new sc(t,n) : new oc(t,0)
        }
        return e.alpha = function(n) {
            return t(+n)
        }
            ,
            e
    }(.5);
    fc.prototype = {
        areaStart: function() {
            this._line = 0
        },
        areaEnd: function() {
            this._line = NaN
        },
        lineStart: function() {
            this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN,
                this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0
        },
        lineEnd: function() {
            (this._line || 0 !== this._line && 3 === this._point) && this._context.closePath(),
                this._line = 1 - this._line
        },
        point: function(t, n) {
            if (t = +t,
                    n = +n,
                    this._point) {
                var e = this._x2 - t
                    , r = this._y2 - n;
                this._l23_a = Math.sqrt(this._l23_2a = Math.pow(e * e + r * r, this._alpha))
            }
            switch (this._point) {
                case 0:
                    this._point = 1;
                    break;
                case 1:
                    this._point = 2;
                    break;
                case 2:
                    this._point = 3,
                        this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);
                    break;
                case 3:
                    this._point = 4;
                default:
                    ac(this, t, n)
            }
            this._l01_a = this._l12_a,
                this._l12_a = this._l23_a,
                this._l01_2a = this._l12_2a,
                this._l12_2a = this._l23_2a,
                this._x0 = this._x1,
                this._x1 = this._x2,
                this._x2 = t,
                this._y0 = this._y1,
                this._y1 = this._y2,
                this._y2 = n
        }
    };
    var im = function t(n) {
        function e(t) {
            return n ? new fc(t,n) : new uc(t,0)
        }
        return e.alpha = function(n) {
            return t(+n)
        }
            ,
            e
    }(.5);
    lc.prototype = {
        areaStart: Jy,
        areaEnd: Jy,
        lineStart: function() {
            this._point = 0
        },
        lineEnd: function() {
            this._point && this._context.closePath()
        },
        point: function(t, n) {
            t = +t,
                n = +n,
                this._point ? this._context.lineTo(t, n) : (this._point = 1,
                    this._context.moveTo(t, n))
        }
    };
    _c.prototype = {
        areaStart: function() {
            this._line = 0
        },
        areaEnd: function() {
            this._line = NaN
        },
        lineStart: function() {
            this._x0 = this._x1 = this._y0 = this._y1 = this._t0 = NaN,
                this._point = 0
        },
        lineEnd: function() {
            switch (this._point) {
                case 2:
                    this._context.lineTo(this._x1, this._y1);
                    break;
                case 3:
                    vc(this, this._t0, dc(this, this._t0))
            }
            (this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(),
                this._line = 1 - this._line
        },
        point: function(t, n) {
            var e = NaN;
            if (t = +t,
                    n = +n,
                t !== this._x1 || n !== this._y1) {
                switch (this._point) {
                    case 0:
                        this._point = 1,
                            this._line ? this._context.lineTo(t, n) : this._context.moveTo(t, n);
                        break;
                    case 1:
                        this._point = 2;
                        break;
                    case 2:
                        this._point = 3,
                            vc(this, dc(this, e = pc(this, t, n)), e);
                        break;
                    default:
                        vc(this, this._t0, e = pc(this, t, n))
                }
                this._x0 = this._x1,
                    this._x1 = t,
                    this._y0 = this._y1,
                    this._y1 = n,
                    this._t0 = e
            }
        }
    },
        (gc.prototype = Object.create(_c.prototype)).point = function(t, n) {
            _c.prototype.point.call(this, n, t)
        }
        ,
        yc.prototype = {
            moveTo: function(t, n) {
                this._context.moveTo(n, t)
            },
            closePath: function() {
                this._context.closePath()
            },
            lineTo: function(t, n) {
                this._context.lineTo(n, t)
            },
            bezierCurveTo: function(t, n, e, r, i, o) {
                this._context.bezierCurveTo(n, t, r, e, o, i)
            }
        },
        mc.prototype = {
            areaStart: function() {
                this._line = 0
            },
            areaEnd: function() {
                this._line = NaN
            },
            lineStart: function() {
                this._x = [],
                    this._y = []
            },
            lineEnd: function() {
                var t = this._x
                    , n = this._y
                    , e = t.length;
                if (e)
                    if (this._line ? this._context.lineTo(t[0], n[0]) : this._context.moveTo(t[0], n[0]),
                        2 === e)
                        this._context.lineTo(t[1], n[1]);
                    else
                        for (var r = xc(t), i = xc(n), o = 0, u = 1; u < e; ++o,
                            ++u)
                            this._context.bezierCurveTo(r[0][o], i[0][o], r[1][o], i[1][o], t[u], n[u]);
                (this._line || 0 !== this._line && 1 === e) && this._context.closePath(),
                    this._line = 1 - this._line,
                    this._x = this._y = null
            },
            point: function(t, n) {
                this._x.push(+t),
                    this._y.push(+n)
            }
        };
    bc.prototype = {
        areaStart: function() {
            this._line = 0
        },
        areaEnd: function() {
            this._line = NaN
        },
        lineStart: function() {
            this._x = this._y = NaN,
                this._point = 0
        },
        lineEnd: function() {
            0 < this._t && this._t < 1 && 2 === this._point && this._context.lineTo(this._x, this._y),
            (this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(),
            this._line >= 0 && (this._t = 1 - this._t,
                this._line = 1 - this._line)
        },
        point: function(t, n) {
            switch (t = +t,
                n = +n,
                this._point) {
                case 0:
                    this._point = 1,
                        this._line ? this._context.lineTo(t, n) : this._context.moveTo(t, n);
                    break;
                case 1:
                    this._point = 2;
                default:
                    if (this._t <= 0)
                        this._context.lineTo(this._x, n),
                            this._context.lineTo(t, n);
                    else {
                        var e = this._x * (1 - this._t) + t * this._t;
                        this._context.lineTo(e, this._y),
                            this._context.lineTo(e, n)
                    }
            }
            this._x = t,
                this._y = n
        }
    };
    var om = function(t, n) {
        if ((i = t.length) > 1)
            for (var e, r, i, o = 1, u = t[n[0]], a = u.length; o < i; ++o)
                for (r = u,
                         u = t[n[o]],
                         e = 0; e < a; ++e)
                    u[e][1] += u[e][0] = isNaN(r[e][1]) ? r[e][0] : r[e][1]
    }
        , um = function(t) {
        for (var n = t.length, e = new Array(n); --n >= 0; )
            e[n] = n;
        return e
    }
        , am = function(t) {
        var n = t.map(Mc);
        return um(t).sort(function(t, e) {
            return n[t] - n[e]
        })
    }
        , cm = function(t) {
        return function() {
            return t
        }
    };
    kc.prototype = {
        constructor: kc,
        insert: function(t, n) {
            var e, r, i;
            if (t) {
                if (n.P = t,
                        n.N = t.N,
                    t.N && (t.N.P = n),
                        t.N = n,
                        t.R) {
                    for (t = t.R; t.L; )
                        t = t.L;
                    t.L = n
                } else
                    t.R = n;
                e = t
            } else
                this._ ? (t = Cc(this._),
                    n.P = null,
                    n.N = t,
                    t.P = t.L = n,
                    e = t) : (n.P = n.N = null,
                    this._ = n,
                    e = null);
            for (n.L = n.R = null,
                     n.U = e,
                     n.C = !0,
                     t = n; e && e.C; )
                e === (r = e.U).L ? (i = r.R) && i.C ? (e.C = i.C = !1,
                    r.C = !0,
                    t = r) : (t === e.R && (Ec(this, e),
                    e = (t = e).U),
                    e.C = !1,
                    r.C = !0,
                    Ac(this, r)) : (i = r.L) && i.C ? (e.C = i.C = !1,
                    r.C = !0,
                    t = r) : (t === e.L && (Ac(this, e),
                    e = (t = e).U),
                    e.C = !1,
                    r.C = !0,
                    Ec(this, r)),
                    e = t.U;
            this._.C = !1
        },
        remove: function(t) {
            t.N && (t.N.P = t.P),
            t.P && (t.P.N = t.N),
                t.N = t.P = null;
            var n, e, r, i = t.U, o = t.L, u = t.R;
            if (e = o ? u ? Cc(u) : o : u,
                    i ? i.L === t ? i.L = e : i.R = e : this._ = e,
                    o && u ? (r = e.C,
                        e.C = t.C,
                        e.L = o,
                        o.U = e,
                        e !== u ? (i = e.U,
                            e.U = t.U,
                            t = e.R,
                            i.L = t,
                            e.R = u,
                            u.U = e) : (e.U = i,
                            i = e,
                            t = e.R)) : (r = t.C,
                        t = e),
                t && (t.U = i),
                    !r)
                if (t && t.C)
                    t.C = !1;
                else {
                    do {
                        if (t === this._)
                            break;
                        if (t === i.L) {
                            if ((n = i.R).C && (n.C = !1,
                                    i.C = !0,
                                    Ec(this, i),
                                    n = i.R),
                                n.L && n.L.C || n.R && n.R.C) {
                                n.R && n.R.C || (n.L.C = !1,
                                    n.C = !0,
                                    Ac(this, n),
                                    n = i.R),
                                    n.C = i.C,
                                    i.C = n.R.C = !1,
                                    Ec(this, i),
                                    t = this._;
                                break
                            }
                        } else if ((n = i.L).C && (n.C = !1,
                                i.C = !0,
                                Ac(this, i),
                                n = i.L),
                            n.L && n.L.C || n.R && n.R.C) {
                            n.L && n.L.C || (n.R.C = !1,
                                n.C = !0,
                                Ec(this, n),
                                n = i.L),
                                n.C = i.C,
                                i.C = n.L.C = !1,
                                Ac(this, i),
                                t = this._;
                            break
                        }
                        n.C = !0,
                            t = i,
                            i = i.U
                    } while (!t.C);t && (t.C = !1)
                }
        }
    };
    var sm, fm, lm, hm, pm, dm = [], vm = [], _m = 1e-6, gm = 1e-12;
    ns.prototype = {
        constructor: ns,
        polygons: function() {
            var t = this.edges;
            return this.cells.map(function(n) {
                var e = n.halfedges.map(function(e) {
                    return Fc(n, t[e])
                });
                return e.data = n.site.data,
                    e
            })
        },
        triangles: function() {
            var t = []
                , n = this.edges;
            return this.cells.forEach(function(e, r) {
                if (o = (i = e.halfedges).length)
                    for (var i, o, u, a = e.site, c = -1, s = n[i[o - 1]], f = s.left === a ? s.right : s.left; ++c < o; )
                        u = f,
                            f = (s = n[i[c]]).left === a ? s.right : s.left,
                        u && f && r < u.index && r < f.index && Kc(a, u, f) < 0 && t.push([a.data, u.data, f.data])
            }),
                t
        },
        links: function() {
            return this.edges.filter(function(t) {
                return t.right
            }).map(function(t) {
                return {
                    source: t.left.data,
                    target: t.right.data
                }
            })
        },
        find: function(t, n, e) {
            for (var r, i, o = this, u = o._found || 0, a = o.cells.length; !(i = o.cells[u]); )
                if (++u >= a)
                    return null;
            var c = t - i.site[0]
                , s = n - i.site[1]
                , f = c * c + s * s;
            do {
                i = o.cells[r = u],
                    u = null,
                    i.halfedges.forEach(function(e) {
                        var r = o.edges[e]
                            , a = r.left;
                        if (a !== i.site && a || (a = r.right)) {
                            var c = t - a[0]
                                , s = n - a[1]
                                , l = c * c + s * s;
                            l < f && (f = l,
                                u = a.index)
                        }
                    })
            } while (null !== u);return o._found = r,
                null == e || f <= e * e ? i.site : null
        }
    };
    var ym = function(t) {
        return function() {
            return t
        }
    };
    rs.prototype = {
        constructor: rs,
        scale: function(t) {
            return 1 === t ? this : new rs(this.k * t,this.x,this.y)
        },
        translate: function(t, n) {
            return 0 === t & 0 === n ? this : new rs(this.k,this.x + this.k * t,this.y + this.k * n)
        },
        apply: function(t) {
            return [t[0] * this.k + this.x, t[1] * this.k + this.y]
        },
        applyX: function(t) {
            return t * this.k + this.x
        },
        applyY: function(t) {
            return t * this.k + this.y
        },
        invert: function(t) {
            return [(t[0] - this.x) / this.k, (t[1] - this.y) / this.k]
        },
        invertX: function(t) {
            return (t - this.x) / this.k
        },
        invertY: function(t) {
            return (t - this.y) / this.k
        },
        rescaleX: function(t) {
            return t.copy().domain(t.range().map(this.invertX, this).map(t.invert, t))
        },
        rescaleY: function(t) {
            return t.copy().domain(t.range().map(this.invertY, this).map(t.invert, t))
        },
        toString: function() {
            return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"
        }
    };
    var mm = new rs(1,0,0);
    is.prototype = rs.prototype;
    var xm = function() {
        t.event.preventDefault(),
            t.event.stopImmediatePropagation()
    };
    t.version = "4.11.0",
        t.bisect = ds,
        t.bisectRight = ds,
        t.bisectLeft = vs,
        t.ascending = ls,
        t.bisector = hs,
        t.cross = function(t, n, r) {
            var i, o, u, a, c = t.length, s = n.length, f = new Array(c * s);
            for (null == r && (r = e),
                     i = u = 0; i < c; ++i)
                for (a = t[i],
                         o = 0; o < s; ++o,
                         ++u)
                    f[u] = r(a, n[o]);
            return f
        }
        ,
        t.descending = function(t, n) {
            return n < t ? -1 : n > t ? 1 : n >= t ? 0 : NaN
        }
        ,
        t.deviation = ys,
        t.extent = ms,
        t.histogram = function() {
            function t(t) {
                var o, u, a = t.length, c = new Array(a);
                for (o = 0; o < a; ++o)
                    c[o] = n(t[o], o, t);
                var s = e(c)
                    , f = s[0]
                    , l = s[1]
                    , h = r(c, f, l);
                Array.isArray(h) || (h = i(f, l, h),
                    h = Ns(Math.ceil(f / h) * h, Math.floor(l / h) * h, h));
                for (var p = h.length; h[0] <= f; )
                    h.shift(),
                        --p;
                for (; h[p - 1] > l; )
                    h.pop(),
                        --p;
                var d, v = new Array(p + 1);
                for (o = 0; o <= p; ++o)
                    (d = v[o] = []).x0 = o > 0 ? h[o - 1] : f,
                        d.x1 = o < p ? h[o] : l;
                for (o = 0; o < a; ++o)
                    f <= (u = c[o]) && u <= l && v[ds(h, u, 0, p)].push(t[o]);
                return v
            }
            var n = Ts
                , e = ms
                , r = Cs;
            return t.value = function(e) {
                return arguments.length ? (n = "function" == typeof e ? e : Ms(e),
                    t) : n
            }
                ,
                t.domain = function(n) {
                    return arguments.length ? (e = "function" == typeof n ? n : Ms([n[0], n[1]]),
                        t) : e
                }
                ,
                t.thresholds = function(n) {
                    return arguments.length ? (r = "function" == typeof n ? n : Ms(Array.isArray(n) ? bs.call(n) : n),
                        t) : r
                }
                ,
                t
        }
        ,
        t.thresholdFreedmanDiaconis = function(t, n, e) {
            return t = ws.call(t, _s).sort(ls),
                Math.ceil((e - n) / (2 * (zs(t, .75) - zs(t, .25)) * Math.pow(t.length, -1 / 3)))
        }
        ,
        t.thresholdScott = function(t, n, e) {
            return Math.ceil((e - n) / (3.5 * ys(t) * Math.pow(t.length, -1 / 3)))
        }
        ,
        t.thresholdSturges = Cs,
        t.max = function(t, n) {
            var e, r, i = t.length, o = -1;
            if (null == n) {
                for (; ++o < i; )
                    if (null != (e = t[o]) && e >= e)
                        for (r = e; ++o < i; )
                            null != (e = t[o]) && e > r && (r = e)
            } else
                for (; ++o < i; )
                    if (null != (e = n(t[o], o, t)) && e >= e)
                        for (r = e; ++o < i; )
                            null != (e = n(t[o], o, t)) && e > r && (r = e);
            return r
        }
        ,
        t.mean = function(t, n) {
            var e, r = t.length, i = r, o = -1, u = 0;
            if (null == n)
                for (; ++o < r; )
                    isNaN(e = _s(t[o])) ? --i : u += e;
            else
                for (; ++o < r; )
                    isNaN(e = _s(n(t[o], o, t))) ? --i : u += e;
            if (i)
                return u / i
        }
        ,
        t.median = function(t, n) {
            var e, r = t.length, i = -1, o = [];
            if (null == n)
                for (; ++i < r; )
                    isNaN(e = _s(t[i])) || o.push(e);
            else
                for (; ++i < r; )
                    isNaN(e = _s(n(t[i], i, t))) || o.push(e);
            return zs(o.sort(ls), .5)
        }
        ,
        t.merge = Ps,
        t.min = Rs,
        t.pairs = function(t, n) {
            null == n && (n = e);
            for (var r = 0, i = t.length - 1, o = t[0], u = new Array(i < 0 ? 0 : i); r < i; )
                u[r] = n(o, o = t[++r]);
            return u
        }
        ,
        t.permute = function(t, n) {
            for (var e = n.length, r = new Array(e); e--; )
                r[e] = t[n[e]];
            return r
        }
        ,
        t.quantile = zs,
        t.range = Ns,
        t.scan = function(t, n) {
            if (e = t.length) {
                var e, r, i = 0, o = 0, u = t[o];
                for (null == n && (n = ls); ++i < e; )
                    (n(r = t[i], u) < 0 || 0 !== n(u, u)) && (u = r,
                        o = i);
                return 0 === n(u, u) ? o : void 0
            }
        }
        ,
        t.shuffle = function(t, n, e) {
            for (var r, i, o = (null == e ? t.length : e) - (n = null == n ? 0 : +n); o; )
                i = Math.random() * o-- | 0,
                    r = t[o + n],
                    t[o + n] = t[i + n],
                    t[i + n] = r;
            return t
        }
        ,
        t.sum = function(t, n) {
            var e, r = t.length, i = -1, o = 0;
            if (null == n)
                for (; ++i < r; )
                    (e = +t[i]) && (o += e);
            else
                for (; ++i < r; )
                    (e = +n(t[i], i, t)) && (o += e);
            return o
        }
        ,
        t.ticks = As,
        t.tickIncrement = r,
        t.tickStep = i,
        t.transpose = Ls,
        t.variance = gs,
        t.zip = function() {
            return Ls(arguments)
        }
        ,
        t.axisTop = function(t) {
            return l(Ds, t)
        }
        ,
        t.axisRight = function(t) {
            return l(Os, t)
        }
        ,
        t.axisBottom = function(t) {
            return l(Fs, t)
        }
        ,
        t.axisLeft = function(t) {
            return l(Is, t)
        }
        ,
        t.brush = function() {
            return he(Ah)
        }
        ,
        t.brushX = function() {
            return he(Sh)
        }
        ,
        t.brushY = function() {
            return he(Eh)
        }
        ,
        t.brushSelection = function(t) {
            var n = t.__brush;
            return n ? n.dim.output(n.selection) : null
        }
        ,
        t.chord = function() {
            function t(t) {
                var o, u, a, c, s, f, l = t.length, h = [], p = Ns(l), d = [], v = [], _ = v.groups = new Array(l), g = new Array(l * l);
                for (o = 0,
                         s = -1; ++s < l; ) {
                    for (u = 0,
                             f = -1; ++f < l; )
                        u += t[s][f];
                    h.push(u),
                        d.push(Ns(l)),
                        o += u
                }
                for (e && p.sort(function(t, n) {
                    return e(h[t], h[n])
                }),
                     r && d.forEach(function(n, e) {
                         n.sort(function(n, i) {
                             return r(t[e][n], t[e][i])
                         })
                     }),
                         c = (o = Ih(0, Fh - n * l) / o) ? n : Fh / l,
                         u = 0,
                         s = -1; ++s < l; ) {
                    for (a = u,
                             f = -1; ++f < l; ) {
                        var y = p[s]
                            , m = d[y][f]
                            , x = t[y][m]
                            , b = u
                            , w = u += x * o;
                        g[m * l + y] = {
                            index: y,
                            subindex: m,
                            startAngle: b,
                            endAngle: w,
                            value: x
                        }
                    }
                    _[y] = {
                        index: y,
                        startAngle: a,
                        endAngle: u,
                        value: h[y]
                    },
                        u += c
                }
                for (s = -1; ++s < l; )
                    for (f = s - 1; ++f < l; ) {
                        var M = g[f * l + s]
                            , T = g[s * l + f];
                        (M.value || T.value) && v.push(M.value < T.value ? {
                            source: T,
                            target: M
                        } : {
                            source: M,
                            target: T
                        })
                    }
                return i ? v.sort(i) : v
            }
            var n = 0
                , e = null
                , r = null
                , i = null;
            return t.padAngle = function(e) {
                return arguments.length ? (n = Ih(0, e),
                    t) : n
            }
                ,
                t.sortGroups = function(n) {
                    return arguments.length ? (e = n,
                        t) : e
                }
                ,
                t.sortSubgroups = function(n) {
                    return arguments.length ? (r = n,
                        t) : r
                }
                ,
                t.sortChords = function(n) {
                    return arguments.length ? (null == n ? i = null : (i = pe(n))._ = n,
                        t) : i && i._
                }
                ,
                t
        }
        ,
        t.ribbon = function() {
            function t() {
                var t, a = Yh.call(arguments), c = n.apply(this, a), s = e.apply(this, a), f = +r.apply(this, (a[0] = c,
                    a)), l = i.apply(this, a) - Oh, h = o.apply(this, a) - Oh, p = f * qh(l), d = f * Uh(l), v = +r.apply(this, (a[0] = s,
                    a)), _ = i.apply(this, a) - Oh, g = o.apply(this, a) - Oh;
                if (u || (u = t = ve()),
                        u.moveTo(p, d),
                        u.arc(0, 0, f, l, h),
                    l === _ && h === g || (u.quadraticCurveTo(0, 0, v * qh(_), v * Uh(_)),
                        u.arc(0, 0, v, _, g)),
                        u.quadraticCurveTo(0, 0, p, d),
                        u.closePath(),
                        t)
                    return u = null,
                    t + "" || null
            }
            var n = _e
                , e = ge
                , r = ye
                , i = me
                , o = xe
                , u = null;
            return t.radius = function(n) {
                return arguments.length ? (r = "function" == typeof n ? n : Bh(+n),
                    t) : r
            }
                ,
                t.startAngle = function(n) {
                    return arguments.length ? (i = "function" == typeof n ? n : Bh(+n),
                        t) : i
                }
                ,
                t.endAngle = function(n) {
                    return arguments.length ? (o = "function" == typeof n ? n : Bh(+n),
                        t) : o
                }
                ,
                t.source = function(e) {
                    return arguments.length ? (n = e,
                        t) : n
                }
                ,
                t.target = function(n) {
                    return arguments.length ? (e = n,
                        t) : e
                }
                ,
                t.context = function(n) {
                    return arguments.length ? (u = null == n ? null : n,
                        t) : u
                }
                ,
                t
        }
        ,
        t.nest = function() {
            function t(n, i, u, a) {
                if (i >= o.length)
                    return null != e && n.sort(e),
                        null != r ? r(n) : n;
                for (var c, s, f, l = -1, h = n.length, p = o[i++], d = we(), v = u(); ++l < h; )
                    (f = d.get(c = p(s = n[l]) + "")) ? f.push(s) : d.set(c, [s]);
                return d.each(function(n, e) {
                    a(v, e, t(n, i, u, a))
                }),
                    v
            }
            function n(t, e) {
                if (++e > o.length)
                    return t;
                var i, a = u[e - 1];
                return null != r && e >= o.length ? i = t.entries() : (i = [],
                    t.each(function(t, r) {
                        i.push({
                            key: r,
                            values: n(t, e)
                        })
                    })),
                    null != a ? i.sort(function(t, n) {
                        return a(t.key, n.key)
                    }) : i
            }
            var e, r, i, o = [], u = [];
            return i = {
                object: function(n) {
                    return t(n, 0, Me, Te)
                },
                map: function(n) {
                    return t(n, 0, Ne, ke)
                },
                entries: function(e) {
                    return n(t(e, 0, Ne, ke), 0)
                },
                key: function(t) {
                    return o.push(t),
                        i
                },
                sortKeys: function(t) {
                    return u[o.length - 1] = t,
                        i
                },
                sortValues: function(t) {
                    return e = t,
                        i
                },
                rollup: function(t) {
                    return r = t,
                        i
                }
            }
        }
        ,
        t.set = Ee,
        t.map = we,
        t.keys = function(t) {
            var n = [];
            for (var e in t)
                n.push(e);
            return n
        }
        ,
        t.values = function(t) {
            var n = [];
            for (var e in t)
                n.push(t[e]);
            return n
        }
        ,
        t.entries = function(t) {
            var n = [];
            for (var e in t)
                n.push({
                    key: e,
                    value: t[e]
                });
            return n
        }
        ,
        t.color = Tt,
        t.rgb = Et,
        t.hsl = Pt,
        t.lab = Ut,
        t.hcl = jt,
        t.cubehelix = $t,
        t.dispatch = h,
        t.drag = function() {
            function n(t) {
                t.on("mousedown.drag", e).filter(g).on("touchstart.drag", o).on("touchmove.drag", u).on("touchend.drag touchcancel.drag", a).style("touch-action", "none").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)")
            }
            function e() {
                if (!p && d.apply(this, arguments)) {
                    var n = c("mouse", v.apply(this, arguments), nf, this, arguments);
                    n && (ff(t.event.view).on("mousemove.drag", r, !0).on("mouseup.drag", i, !0),
                        pf(t.event.view),
                        vt(),
                        l = !1,
                        s = t.event.clientX,
                        f = t.event.clientY,
                        n("start"))
                }
            }
            function r() {
                if (hf(),
                        !l) {
                    var n = t.event.clientX - s
                        , e = t.event.clientY - f;
                    l = n * n + e * e > b
                }
                y.mouse("drag")
            }
            function i() {
                ff(t.event.view).on("mousemove.drag mouseup.drag", null),
                    _t(t.event.view, l),
                    hf(),
                    y.mouse("end")
            }
            function o() {
                if (d.apply(this, arguments)) {
                    var n, e, r = t.event.changedTouches, i = v.apply(this, arguments), o = r.length;
                    for (n = 0; n < o; ++n)
                        (e = c(r[n].identifier, i, lf, this, arguments)) && (vt(),
                            e("start"))
                }
            }
            function u() {
                var n, e, r = t.event.changedTouches, i = r.length;
                for (n = 0; n < i; ++n)
                    (e = y[r[n].identifier]) && (hf(),
                        e("drag"))
            }
            function a() {
                var n, e, r = t.event.changedTouches, i = r.length;
                for (p && clearTimeout(p),
                         p = setTimeout(function() {
                             p = null
                         }, 500),
                         n = 0; n < i; ++n)
                    (e = y[r[n].identifier]) && (vt(),
                        e("end"))
            }
            function c(e, r, i, o, u) {
                var a, c, s, f = i(r, e), l = m.copy();
                if (k(new gt(n,"beforestart",a,e,x,f[0],f[1],0,0,l), function() {
                        return null != (t.event.subject = a = _.apply(o, u)) && (c = a.x - f[0] || 0,
                            s = a.y - f[1] || 0,
                            !0)
                    }))
                    return function t(h) {
                        var p, d = f;
                        switch (h) {
                            case "start":
                                y[e] = t,
                                    p = x++;
                                break;
                            case "end":
                                delete y[e],
                                    --x;
                            case "drag":
                                f = i(r, e),
                                    p = x
                        }
                        k(new gt(n,h,a,e,p,f[0] + c,f[1] + s,f[0] - d[0],f[1] - d[1],l), l.apply, l, [h, o, u])
                    }
            }
            var s, f, l, p, d = yt, v = mt, _ = xt, g = bt, y = {}, m = h("start", "drag", "end"), x = 0, b = 0;
            return n.filter = function(t) {
                return arguments.length ? (d = "function" == typeof t ? t : df(!!t),
                    n) : d
            }
                ,
                n.container = function(t) {
                    return arguments.length ? (v = "function" == typeof t ? t : df(t),
                        n) : v
                }
                ,
                n.subject = function(t) {
                    return arguments.length ? (_ = "function" == typeof t ? t : df(t),
                        n) : _
                }
                ,
                n.touchable = function(t) {
                    return arguments.length ? (g = "function" == typeof t ? t : df(!!t),
                        n) : g
                }
                ,
                n.on = function() {
                    var t = m.on.apply(m, arguments);
                    return t === m ? n : t
                }
                ,
                n.clickDistance = function(t) {
                    return arguments.length ? (b = (t = +t) * t,
                        n) : Math.sqrt(b)
                }
                ,
                n
        }
        ,
        t.dragDisable = pf,
        t.dragEnable = _t,
        t.dsvFormat = Qh,
        t.csvParse = tp,
        t.csvParseRows = np,
        t.csvFormat = ep,
        t.csvFormatRows = rp,
        t.tsvParse = op,
        t.tsvParseRows = up,
        t.tsvFormat = ap,
        t.tsvFormatRows = cp,
        t.easeLinear = function(t) {
            return +t
        }
        ,
        t.easeQuad = Kn,
        t.easeQuadIn = function(t) {
            return t * t
        }
        ,
        t.easeQuadOut = function(t) {
            return t * (2 - t)
        }
        ,
        t.easeQuadInOut = Kn,
        t.easeCubic = te,
        t.easeCubicIn = function(t) {
            return t * t * t
        }
        ,
        t.easeCubicOut = function(t) {
            return --t * t * t + 1
        }
        ,
        t.easeCubicInOut = te,
        t.easePoly = Ql,
        t.easePolyIn = Gl,
        t.easePolyOut = Jl,
        t.easePolyInOut = Ql,
        t.easeSin = ne,
        t.easeSinIn = function(t) {
            return 1 - Math.cos(t * th)
        }
        ,
        t.easeSinOut = function(t) {
            return Math.sin(t * th)
        }
        ,
        t.easeSinInOut = ne,
        t.easeExp = ee,
        t.easeExpIn = function(t) {
            return Math.pow(2, 10 * t - 10)
        }
        ,
        t.easeExpOut = function(t) {
            return 1 - Math.pow(2, -10 * t)
        }
        ,
        t.easeExpInOut = ee,
        t.easeCircle = re,
        t.easeCircleIn = function(t) {
            return 1 - Math.sqrt(1 - t * t)
        }
        ,
        t.easeCircleOut = function(t) {
            return Math.sqrt(1 - --t * t)
        }
        ,
        t.easeCircleInOut = re,
        t.easeBounce = ie,
        t.easeBounceIn = function(t) {
            return 1 - ie(1 - t)
        }
        ,
        t.easeBounceOut = ie,
        t.easeBounceInOut = function(t) {
            return ((t *= 2) <= 1 ? 1 - ie(1 - t) : ie(t - 1) + 1) / 2
        }
        ,
        t.easeBack = ph,
        t.easeBackIn = lh,
        t.easeBackOut = hh,
        t.easeBackInOut = ph,
        t.easeElastic = _h,
    t.easeElasticIn = vh,
    t.easeElasticOut = _h,
    t.easeElasticInOut = gh,
    t.forceCenter = function(t, n) {
        function e() {
            var e, i, o = r.length, u = 0, a = 0;
            for (e = 0; e < o; ++e)
                u += (i = r[e]).x,
                    a += i.y;
            for (u = u / o - t,
                     a = a / o - n,
                     e = 0; e < o; ++e)
                (i = r[e]).x -= u,
                    i.y -= a
        }
        var r;
        return null == t && (t = 0),
        null == n && (n = 0),
            e.initialize = function(t) {
                r = t
            }
            ,
            e.x = function(n) {
                return arguments.length ? (t = +n,
                    e) : t
            }
            ,
            e.y = function(t) {
                return arguments.length ? (n = +t,
                    e) : n
            }
            ,
            e
    }
    ,
    t.forceCollide = function(t) {
        function n() {
            for (var t, n, r, c, s, f, l, h = i.length, p = 0; p < a; ++p)
                for (n = qe(i, Oe, Fe).visitAfter(e),
                         t = 0; t < h; ++t)
                    r = i[t],
                        f = o[r.index],
                        l = f * f,
                        c = r.x + r.vx,
                        s = r.y + r.vy,
                        n.visit(function(t, n, e, i, o) {
                            var a = t.data
                                , h = t.r
                                , p = f + h;
                            if (!a)
                                return n > c + p || i < c - p || e > s + p || o < s - p;
                            if (a.index > r.index) {
                                var d = c - a.x - a.vx
                                    , v = s - a.y - a.vy
                                    , _ = d * d + v * v;
                                _ < p * p && (0 === d && (d = fp(),
                                    _ += d * d),
                                0 === v && (v = fp(),
                                    _ += v * v),
                                    _ = (p - (_ = Math.sqrt(_))) / _ * u,
                                    r.vx += (d *= _) * (p = (h *= h) / (l + h)),
                                    r.vy += (v *= _) * p,
                                    a.vx -= d * (p = 1 - p),
                                    a.vy -= v * p)
                            }
                        })
        }
        function e(t) {
            if (t.data)
                return t.r = o[t.data.index];
            for (var n = t.r = 0; n < 4; ++n)
                t[n] && t[n].r > t.r && (t.r = t[n].r)
        }
        function r() {
            if (i) {
                var n, e, r = i.length;
                for (o = new Array(r),
                         n = 0; n < r; ++n)
                    e = i[n],
                        o[e.index] = +t(e, n, i)
            }
        }
        var i, o, u = 1, a = 1;
        return "function" != typeof t && (t = sp(null == t ? 1 : +t)),
            n.initialize = function(t) {
                i = t,
                    r()
            }
            ,
            n.iterations = function(t) {
                return arguments.length ? (a = +t,
                    n) : a
            }
            ,
            n.strength = function(t) {
                return arguments.length ? (u = +t,
                    n) : u
            }
            ,
            n.radius = function(e) {
                return arguments.length ? (t = "function" == typeof e ? e : sp(+e),
                    r(),
                    n) : t
            }
            ,
            n
    }
    ,
    t.forceLink = function(t) {
        function n(n) {
            for (var e = 0, r = t.length; e < p; ++e)
                for (var i, a, c, f, l, h, d, v = 0; v < r; ++v)
                    a = (i = t[v]).source,
                        f = (c = i.target).x + c.vx - a.x - a.vx || fp(),
                        l = c.y + c.vy - a.y - a.vy || fp(),
                        f *= h = ((h = Math.sqrt(f * f + l * l)) - u[v]) / h * n * o[v],
                        l *= h,
                        c.vx -= f * (d = s[v]),
                        c.vy -= l * d,
                        a.vx += f * (d = 1 - d),
                        a.vy += l * d
        }
        function e() {
            if (a) {
                var n, e, l = a.length, h = t.length, p = we(a, f);
                for (n = 0,
                         c = new Array(l); n < h; ++n)
                    (e = t[n]).index = n,
                    "object" != typeof e.source && (e.source = Ye(p, e.source)),
                    "object" != typeof e.target && (e.target = Ye(p, e.target)),
                        c[e.source.index] = (c[e.source.index] || 0) + 1,
                        c[e.target.index] = (c[e.target.index] || 0) + 1;
                for (n = 0,
                         s = new Array(h); n < h; ++n)
                    e = t[n],
                        s[n] = c[e.source.index] / (c[e.source.index] + c[e.target.index]);
                o = new Array(h),
                    r(),
                    u = new Array(h),
                    i()
            }
        }
        function r() {
            if (a)
                for (var n = 0, e = t.length; n < e; ++n)
                    o[n] = +l(t[n], n, t)
        }
        function i() {
            if (a)
                for (var n = 0, e = t.length; n < e; ++n)
                    u[n] = +h(t[n], n, t)
        }
        var o, u, a, c, s, f = Ie, l = function(t) {
            return 1 / Math.min(c[t.source.index], c[t.target.index])
        }, h = sp(30), p = 1;
        return null == t && (t = []),
            n.initialize = function(t) {
                a = t,
                    e()
            }
            ,
            n.links = function(r) {
                return arguments.length ? (t = r,
                    e(),
                    n) : t
            }
            ,
            n.id = function(t) {
                return arguments.length ? (f = t,
                    n) : f
            }
            ,
            n.iterations = function(t) {
                return arguments.length ? (p = +t,
                    n) : p
            }
            ,
            n.strength = function(t) {
                return arguments.length ? (l = "function" == typeof t ? t : sp(+t),
                    r(),
                    n) : l
            }
            ,
            n.distance = function(t) {
                return arguments.length ? (h = "function" == typeof t ? t : sp(+t),
                    i(),
                    n) : h
            }
            ,
            n
    }
    ,
    t.forceManyBody = function() {
        function t(t) {
            var n, a = i.length, c = qe(i, Be, je).visitAfter(e);
            for (u = t,
                     n = 0; n < a; ++n)
                o = i[n],
                    c.visit(r)
        }
        function n() {
            if (i) {
                var t, n, e = i.length;
                for (a = new Array(e),
                         t = 0; t < e; ++t)
                    n = i[t],
                        a[n.index] = +c(n, t, i)
            }
        }
        function e(t) {
            var n, e, r, i, o, u = 0, c = 0;
            if (t.length) {
                for (r = i = o = 0; o < 4; ++o)
                    (n = t[o]) && (e = Math.abs(n.value)) && (u += n.value,
                        c += e,
                        r += e * n.x,
                        i += e * n.y);
                t.x = r / c,
                    t.y = i / c
            } else {
                (n = t).x = n.data.x,
                    n.y = n.data.y;
                do {
                    u += a[n.data.index]
                } while (n = n.next)
            }
            t.value = u
        }
        function r(t, n, e, r) {
            if (!t.value)
                return !0;
            var i = t.x - o.x
                , c = t.y - o.y
                , h = r - n
                , p = i * i + c * c;
            if (h * h / l < p)
                return p < f && (0 === i && (i = fp(),
                    p += i * i),
                0 === c && (c = fp(),
                    p += c * c),
                p < s && (p = Math.sqrt(s * p)),
                    o.vx += i * t.value * u / p,
                    o.vy += c * t.value * u / p),
                    !0;
            if (!(t.length || p >= f)) {
                (t.data !== o || t.next) && (0 === i && (i = fp(),
                    p += i * i),
                0 === c && (c = fp(),
                    p += c * c),
                p < s && (p = Math.sqrt(s * p)));
                do {
                    t.data !== o && (h = a[t.data.index] * u / p,
                        o.vx += i * h,
                        o.vy += c * h)
                } while (t = t.next)
            }
        }
        var i, o, u, a, c = sp(-30), s = 1, f = 1 / 0, l = .81;
        return t.initialize = function(t) {
            i = t,
                n()
        }
            ,
            t.strength = function(e) {
                return arguments.length ? (c = "function" == typeof e ? e : sp(+e),
                    n(),
                    t) : c
            }
            ,
            t.distanceMin = function(n) {
                return arguments.length ? (s = n * n,
                    t) : Math.sqrt(s)
            }
            ,
            t.distanceMax = function(n) {
                return arguments.length ? (f = n * n,
                    t) : Math.sqrt(f)
            }
            ,
            t.theta = function(n) {
                return arguments.length ? (l = n * n,
                    t) : Math.sqrt(l)
            }
            ,
            t
    }
    ,
    t.forceRadial = function(t, n, e) {
        function r(t) {
            for (var r = 0, i = o.length; r < i; ++r) {
                var c = o[r]
                    , s = c.x - n || 1e-6
                    , f = c.y - e || 1e-6
                    , l = Math.sqrt(s * s + f * f)
                    , h = (a[r] - l) * u[r] * t / l;
                c.vx += s * h,
                    c.vy += f * h
            }
        }
        function i() {
            if (o) {
                var n, e = o.length;
                for (u = new Array(e),
                         a = new Array(e),
                         n = 0; n < e; ++n)
                    a[n] = +t(o[n], n, o),
                        u[n] = isNaN(a[n]) ? 0 : +c(o[n], n, o)
            }
        }
        var o, u, a, c = sp(.1);
        return "function" != typeof t && (t = sp(+t)),
        null == n && (n = 0),
        null == e && (e = 0),
            r.initialize = function(t) {
                o = t,
                    i()
            }
            ,
            r.strength = function(t) {
                return arguments.length ? (c = "function" == typeof t ? t : sp(+t),
                    i(),
                    r) : c
            }
            ,
            r.radius = function(n) {
                return arguments.length ? (t = "function" == typeof n ? n : sp(+n),
                    i(),
                    r) : t
            }
            ,
            r.x = function(t) {
                return arguments.length ? (n = +t,
                    r) : n
            }
            ,
            r.y = function(t) {
                return arguments.length ? (e = +t,
                    r) : e
            }
            ,
            r
    }
    ,
    t.forceSimulation = function(t) {
        function n() {
            e(),
                d.call("tick", o),
            u < a && (p.stop(),
                d.call("end", o))
        }
        function e() {
            var n, e, r = t.length;
            for (u += (s - u) * c,
                     l.each(function(t) {
                         t(u)
                     }),
                     n = 0; n < r; ++n)
                null == (e = t[n]).fx ? e.x += e.vx *= f : (e.x = e.fx,
                    e.vx = 0),
                    null == e.fy ? e.y += e.vy *= f : (e.y = e.fy,
                        e.vy = 0)
        }
        function r() {
            for (var n, e = 0, r = t.length; e < r; ++e) {
                if (n = t[e],
                        n.index = e,
                    isNaN(n.x) || isNaN(n.y)) {
                    var i = dp * Math.sqrt(e)
                        , o = e * vp;
                    n.x = i * Math.cos(o),
                        n.y = i * Math.sin(o)
                }
                (isNaN(n.vx) || isNaN(n.vy)) && (n.vx = n.vy = 0)
            }
        }
        function i(n) {
            return n.initialize && n.initialize(t),
                n
        }
        var o, u = 1, a = .001, c = 1 - Math.pow(a, 1 / 300), s = 0, f = .6, l = we(), p = dn(n), d = h("tick", "end");
        return null == t && (t = []),
            r(),
            o = {
                tick: e,
                restart: function() {
                    return p.restart(n),
                        o
                },
                stop: function() {
                    return p.stop(),
                        o
                },
                nodes: function(n) {
                    return arguments.length ? (t = n,
                        r(),
                        l.each(i),
                        o) : t
                },
                alpha: function(t) {
                    return arguments.length ? (u = +t,
                        o) : u
                },
                alphaMin: function(t) {
                    return arguments.length ? (a = +t,
                        o) : a
                },
                alphaDecay: function(t) {
                    return arguments.length ? (c = +t,
                        o) : +c
                },
                alphaTarget: function(t) {
                    return arguments.length ? (s = +t,
                        o) : s
                },
                velocityDecay: function(t) {
                    return arguments.length ? (f = 1 - t,
                        o) : 1 - f
                },
                force: function(t, n) {
                    return arguments.length > 1 ? (null == n ? l.remove(t) : l.set(t, i(n)),
                        o) : l.get(t)
                },
                find: function(n, e, r) {
                    var i, o, u, a, c, s = 0, f = t.length;
                    for (null == r ? r = 1 / 0 : r *= r,
                             s = 0; s < f; ++s)
                        (u = (i = n - (a = t[s]).x) * i + (o = e - a.y) * o) < r && (c = a,
                            r = u);
                    return c
                },
                on: function(t, n) {
                    return arguments.length > 1 ? (d.on(t, n),
                        o) : d.on(t)
                }
            }
    }
    ,
    t.forceX = function(t) {
        function n(t) {
            for (var n, e = 0, u = r.length; e < u; ++e)
                (n = r[e]).vx += (o[e] - n.x) * i[e] * t
        }
        function e() {
            if (r) {
                var n, e = r.length;
                for (i = new Array(e),
                         o = new Array(e),
                         n = 0; n < e; ++n)
                    i[n] = isNaN(o[n] = +t(r[n], n, r)) ? 0 : +u(r[n], n, r)
            }
        }
        var r, i, o, u = sp(.1);
        return "function" != typeof t && (t = sp(null == t ? 0 : +t)),
            n.initialize = function(t) {
                r = t,
                    e()
            }
            ,
            n.strength = function(t) {
                return arguments.length ? (u = "function" == typeof t ? t : sp(+t),
                    e(),
                    n) : u
            }
            ,
            n.x = function(r) {
                return arguments.length ? (t = "function" == typeof r ? r : sp(+r),
                    e(),
                    n) : t
            }
            ,
            n
    }
    ,
    t.forceY = function(t) {
        function n(t) {
            for (var n, e = 0, u = r.length; e < u; ++e)
                (n = r[e]).vy += (o[e] - n.y) * i[e] * t
        }
        function e() {
            if (r) {
                var n, e = r.length;
                for (i = new Array(e),
                         o = new Array(e),
                         n = 0; n < e; ++n)
                    i[n] = isNaN(o[n] = +t(r[n], n, r)) ? 0 : +u(r[n], n, r)
            }
        }
        var r, i, o, u = sp(.1);
        return "function" != typeof t && (t = sp(null == t ? 0 : +t)),
            n.initialize = function(t) {
                r = t,
                    e()
            }
            ,
            n.strength = function(t) {
                return arguments.length ? (u = "function" == typeof t ? t : sp(+t),
                    e(),
                    n) : u
            }
            ,
            n.y = function(r) {
                return arguments.length ? (t = "function" == typeof r ? r : sp(+r),
                    e(),
                    n) : t
            }
            ,
            n
    }
    ,
    t.formatDefaultLocale = $e,
    t.formatLocale = kp,
    t.formatSpecifier = He,
    t.precisionFixed = Sp,
    t.precisionPrefix = Ep,
    t.precisionRound = Ap,
    t.geoArea = function(t) {
        return Pd.reset(),
            Cd(t, Rd),
        2 * Pd
    }
    ,
    t.geoBounds = function(t) {
        var n, e, r, i, o, u, a;
        if (Fp = Op = -(Up = Dp = 1 / 0),
                Hp = [],
                Cd(t, qd),
                e = Hp.length) {
            for (Hp.sort(br),
                     n = 1,
                     o = [r = Hp[0]]; n < e; ++n)
                wr(r, (i = Hp[n])[0]) || wr(r, i[1]) ? (xr(r[0], i[1]) > xr(r[0], r[1]) && (r[1] = i[1]),
                xr(i[0], r[1]) > xr(r[0], r[1]) && (r[0] = i[0])) : o.push(r = i);
            for (u = -1 / 0,
                     n = 0,
                     r = o[e = o.length - 1]; n <= e; r = i,
                     ++n)
                i = o[n],
                (a = xr(r[1], i[0])) > u && (u = a,
                    Up = i[0],
                    Op = r[1])
        }
        return Hp = Xp = null,
            Up === 1 / 0 || Dp === 1 / 0 ? [[NaN, NaN], [NaN, NaN]] : [[Up, Dp], [Op, Fp]]
    }
    ,
    t.geoCentroid = function(t) {
        $p = Vp = Wp = Zp = Gp = Jp = Qp = Kp = td = nd = ed = 0,
            Cd(t, Ud);
        var n = td
            , e = nd
            , r = ed
            , i = n * n + e * e + r * r;
        return i < 1e-12 && (n = Jp,
            e = Qp,
            r = Kp,
        Vp < sd && (n = Wp,
            e = Zp,
            r = Gp),
        (i = n * n + e * e + r * r) < 1e-12) ? [NaN, NaN] : [yd(e, n) * dd, Ge(r / kd(i)) * dd]
    }
    ,
    t.geoCircle = function() {
        function t() {
            var t = r.apply(this, arguments)
                , a = i.apply(this, arguments) * vd
                , c = o.apply(this, arguments) * vd;
            return n = [],
                e = Lr(-t[0] * vd, -t[1] * vd, 0).invert,
                Or(u, a, c, 1),
                t = {
                    type: "Polygon",
                    coordinates: [n]
                },
                n = e = null,
                t
        }
        var n, e, r = Dd([0, 0]), i = Dd(90), o = Dd(6), u = {
            point: function(t, r) {
                n.push(t = e(t, r)),
                    t[0] *= dd,
                    t[1] *= dd
            }
        };
        return t.center = function(n) {
            return arguments.length ? (r = "function" == typeof n ? n : Dd([+n[0], +n[1]]),
                t) : r
        }
            ,
            t.radius = function(n) {
                return arguments.length ? (i = "function" == typeof n ? n : Dd(+n),
                    t) : i
            }
            ,
            t.precision = function(n) {
                return arguments.length ? (o = "function" == typeof n ? n : Dd(+n),
                    t) : o
            }
            ,
            t
    }
    ,
    t.geoClipAntimeridian = rv,
    t.geoClipCircle = iv,
    t.geoClipExtent = function() {
        var t, n, e, r = 0, i = 0, o = 960, u = 500;
        return e = {
            stream: function(e) {
                return t && n === e ? t : t = Xr(r, i, o, u)(n = e)
            },
            extent: function(a) {
                return arguments.length ? (r = +a[0][0],
                    i = +a[0][1],
                    o = +a[1][0],
                    u = +a[1][1],
                    t = n = null,
                    e) : [[r, i], [o, u]]
            }
        }
    }
    ,
    t.geoClipRectangle = Xr,
    t.geoContains = function(t, n) {
        return (t && dv.hasOwnProperty(t.type) ? dv[t.type] : Zr)(t, n)
    }
    ,
    t.geoDistance = pv,
    t.geoGraticule = ri,
    t.geoGraticule10 = function() {
        return ri()()
    }
    ,
    t.geoInterpolate = function(t, n) {
        var e = t[0] * vd
            , r = t[1] * vd
            , i = n[0] * vd
            , o = n[1] * vd
            , u = md(r)
            , a = Td(r)
            , c = md(o)
            , s = Td(o)
            , f = u * md(e)
            , l = u * Td(e)
            , h = c * md(i)
            , p = c * Td(i)
            , d = 2 * Ge(kd(Je(o - r) + u * c * Je(i - e)))
            , v = Td(d)
            , _ = d ? function(t) {
                var n = Td(t *= d) / v
                    , e = Td(d - t) / v
                    , r = e * f + n * h
                    , i = e * l + n * p
                    , o = e * a + n * s;
                return [yd(i, r) * dd, yd(o, kd(r * r + i * i)) * dd]
            }
            : function() {
                return [e * dd, r * dd]
            }
        ;
        return _.distance = d,
            _
    }
    ,
    t.geoLength = fv,
    t.geoPath = function(t, n) {
        function e(t) {
            return t && ("function" == typeof o && i.pointRadius(+o.apply(this, arguments)),
                Cd(t, r(i))),
                i.result()
        }
        var r, i, o = 4.5;
        return e.area = function(t) {
            return Cd(t, r(mv)),
                mv.result()
        }
            ,
            e.measure = function(t) {
                return Cd(t, r(Yv)),
                    Yv.result()
            }
            ,
            e.bounds = function(t) {
                return Cd(t, r(Tv)),
                    Tv.result()
            }
            ,
            e.centroid = function(t) {
                return Cd(t, r(Lv)),
                    Lv.result()
            }
            ,
            e.projection = function(n) {
                return arguments.length ? (r = null == n ? (t = null,
                    _v) : (t = n).stream,
                    e) : t
            }
            ,
            e.context = function(t) {
                return arguments.length ? (i = null == t ? (n = null,
                    new xi) : new gi(n = t),
                "function" != typeof o && i.pointRadius(o),
                    e) : n
            }
            ,
            e.pointRadius = function(t) {
                return arguments.length ? (o = "function" == typeof t ? t : (i.pointRadius(+t),
                    +t),
                    e) : o
            }
            ,
            e.projection(t).context(n)
    }
    ,
    t.geoAlbers = Vv,
    t.geoAlbersUsa = function() {
        function t(t) {
            var n = t[0]
                , e = t[1];
            return a = null,
                i.point(n, e),
            a || (o.point(n, e),
                a) || (u.point(n, e),
                a)
        }
        function n() {
            return e = r = null,
                t
        }
        var e, r, i, o, u, a, c = Vv(), s = $v().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), f = $v().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), l = {
            point: function(t, n) {
                a = [t, n]
            }
        };
        return t.invert = function(t) {
            var n = c.scale()
                , e = c.translate()
                , r = (t[0] - e[0]) / n
                , i = (t[1] - e[1]) / n;
            return (i >= .12 && i < .234 && r >= -.425 && r < -.214 ? s : i >= .166 && i < .234 && r >= -.214 && r < -.115 ? f : c).invert(t)
        }
            ,
            t.stream = function(t) {
                return e && r === t ? e : e = Li([c.stream(r = t), s.stream(t), f.stream(t)])
            }
            ,
            t.precision = function(t) {
                return arguments.length ? (c.precision(t),
                    s.precision(t),
                    f.precision(t),
                    n()) : c.precision()
            }
            ,
            t.scale = function(n) {
                return arguments.length ? (c.scale(n),
                    s.scale(.35 * n),
                    f.scale(n),
                    t.translate(c.translate())) : c.scale()
            }
            ,
            t.translate = function(t) {
                if (!arguments.length)
                    return c.translate();
                var e = c.scale()
                    , r = +t[0]
                    , a = +t[1];
                return i = c.translate(t).clipExtent([[r - .455 * e, a - .238 * e], [r + .455 * e, a + .238 * e]]).stream(l),
                    o = s.translate([r - .307 * e, a + .201 * e]).clipExtent([[r - .425 * e + sd, a + .12 * e + sd], [r - .214 * e - sd, a + .234 * e - sd]]).stream(l),
                    u = f.translate([r - .205 * e, a + .212 * e]).clipExtent([[r - .214 * e + sd, a + .166 * e + sd], [r - .115 * e - sd, a + .234 * e - sd]]).stream(l),
                    n()
            }
            ,
            t.fitExtent = function(n, e) {
                return Ti(t, n, e)
            }
            ,
            t.fitSize = function(n, e) {
                return Ni(t, n, e)
            }
            ,
            t.scale(1070)
    }
    ,
    t.geoAzimuthalEqualArea = function() {
        return Ai(Wv).scale(124.75).clipAngle(179.999)
    }
    ,
    t.geoAzimuthalEqualAreaRaw = Wv,
    t.geoAzimuthalEquidistant = function() {
        return Ai(Zv).scale(79.4188).clipAngle(179.999)
    }
    ,
    t.geoAzimuthalEquidistantRaw = Zv,
    t.geoConicConformal = function() {
        return zi(Ii).scale(109.5).parallels([30, 30])
    }
    ,
    t.geoConicConformalRaw = Ii,
    t.geoConicEqualArea = $v,
    t.geoConicEqualAreaRaw = Ri,
    t.geoConicEquidistant = function() {
        return zi(Bi).scale(131.154).center([0, 13.9389])
    }
    ,
    t.geoConicEquidistantRaw = Bi,
    t.geoEquirectangular = function() {
        return Ai(Yi).scale(152.63)
    }
    ,
    t.geoEquirectangularRaw = Yi,
    t.geoGnomonic = function() {
        return Ai(ji).scale(144.049).clipAngle(60)
    }
    ,
    t.geoGnomonicRaw = ji,
    t.geoIdentity = function() {
        function t() {
            return i = o = null,
                u
        }
        var n, e, r, i, o, u, a = 1, c = 0, s = 0, f = 1, l = 1, h = _v, p = null, d = _v;
        return u = {
            stream: function(t) {
                return i && o === t ? i : i = h(d(o = t))
            },
            postclip: function(i) {
                return arguments.length ? (d = i,
                    p = n = e = r = null,
                    t()) : d
            },
            clipExtent: function(i) {
                return arguments.length ? (d = null == i ? (p = n = e = r = null,
                    _v) : Xr(p = +i[0][0], n = +i[0][1], e = +i[1][0], r = +i[1][1]),
                    t()) : null == p ? null : [[p, n], [e, r]]
            },
            scale: function(n) {
                return arguments.length ? (h = Hi((a = +n) * f, a * l, c, s),
                    t()) : a
            },
            translate: function(n) {
                return arguments.length ? (h = Hi(a * f, a * l, c = +n[0], s = +n[1]),
                    t()) : [c, s]
            },
            reflectX: function(n) {
                return arguments.length ? (h = Hi(a * (f = n ? -1 : 1), a * l, c, s),
                    t()) : f < 0
            },
            reflectY: function(n) {
                return arguments.length ? (h = Hi(a * f, a * (l = n ? -1 : 1), c, s),
                    t()) : l < 0
            },
            fitExtent: function(t, n) {
                return Ti(u, t, n)
            },
            fitSize: function(t, n) {
                return Ni(u, t, n)
            }
        }
    }
    ,
    t.geoProjection = Ai,
    t.geoProjectionMutator = Ci,
    t.geoMercator = function() {
        return Oi(Di).scale(961 / pd)
    }
    ,
    t.geoMercatorRaw = Di,
    t.geoNaturalEarth1 = function() {
        return Ai(Xi).scale(175.295)
    }
    ,
    t.geoNaturalEarth1Raw = Xi,
    t.geoOrthographic = function() {
        return Ai($i).scale(249.5).clipAngle(90 + sd)
    }
    ,
    t.geoOrthographicRaw = $i,
    t.geoStereographic = function() {
        return Ai(Vi).scale(250).clipAngle(142)
    }
    ,
    t.geoStereographicRaw = Vi,
    t.geoTransverseMercator = function() {
        var t = Oi(Wi)
            , n = t.center
            , e = t.rotate;
        return t.center = function(t) {
            return arguments.length ? n([-t[1], t[0]]) : (t = n(),
                [t[1], -t[0]])
        }
            ,
            t.rotate = function(t) {
                return arguments.length ? e([t[0], t[1], t.length > 2 ? t[2] + 90 : 90]) : (t = e(),
                    [t[0], t[1], t[2] - 90])
            }
            ,
            e([0, 0, 90]).scale(159.155)
    }
    ,
    t.geoTransverseMercatorRaw = Wi,
    t.geoRotation = Gd,
    t.geoStream = Cd,
    t.geoTransform = function(t) {
        return {
            stream: wi(t)
        }
    }
    ,
    t.cluster = function() {
        function t(t) {
            var o, u = 0;
            t.eachAfter(function(t) {
                var e = t.children;
                e ? (t.x = Gi(e),
                    t.y = Qi(e)) : (t.x = o ? u += n(t, o) : 0,
                    t.y = 0,
                    o = t)
            });
            var a = to(t)
                , c = no(t)
                , s = a.x - n(a, c) / 2
                , f = c.x + n(c, a) / 2;
            return t.eachAfter(i ? function(n) {
                    n.x = (n.x - t.x) * e,
                        n.y = (t.y - n.y) * r
                }
                : function(n) {
                    n.x = (n.x - s) / (f - s) * e,
                        n.y = (1 - (t.y ? n.y / t.y : 1)) * r
                }
            )
        }
        var n = Zi
            , e = 1
            , r = 1
            , i = !1;
        return t.separation = function(e) {
            return arguments.length ? (n = e,
                t) : n
        }
            ,
            t.size = function(n) {
                return arguments.length ? (i = !1,
                    e = +n[0],
                    r = +n[1],
                    t) : i ? null : [e, r]
            }
            ,
            t.nodeSize = function(n) {
                return arguments.length ? (i = !0,
                    e = +n[0],
                    r = +n[1],
                    t) : i ? [e, r] : null
            }
            ,
            t
    }
    ,
    t.hierarchy = io,
    t.pack = function() {
        function t(t) {
            return t.x = e / 2,
                t.y = r / 2,
                n ? t.eachBefore(Eo(n)).eachAfter(Ao(i, .5)).eachBefore(Co(1)) : t.eachBefore(Eo(So)).eachAfter(Ao(ko, 1)).eachAfter(Ao(i, t.r / Math.min(e, r))).eachBefore(Co(Math.min(e, r) / (2 * t.r))),
                t
        }
        var n = null
            , e = 1
            , r = 1
            , i = ko;
        return t.radius = function(e) {
            return arguments.length ? (n = To(e),
                t) : n
        }
            ,
            t.size = function(n) {
                return arguments.length ? (e = +n[0],
                    r = +n[1],
                    t) : [e, r]
            }
            ,
            t.padding = function(n) {
                return arguments.length ? (i = "function" == typeof n ? n : Qv(+n),
                    t) : i
            }
            ,
            t
    }
    ,
    t.packSiblings = function(t) {
        return Mo(t),
            t
    }
    ,
    t.packEnclose = Jv,
    t.partition = function() {
        function t(t) {
            var u = t.height + 1;
            return t.x0 = t.y0 = i,
                t.x1 = e,
                t.y1 = r / u,
                t.eachBefore(n(r, u)),
            o && t.eachBefore(Kv),
                t
        }
        function n(t, n) {
            return function(e) {
                e.children && t_(e, e.x0, t * (e.depth + 1) / n, e.x1, t * (e.depth + 2) / n);
                var r = e.x0
                    , o = e.y0
                    , u = e.x1 - i
                    , a = e.y1 - i;
                u < r && (r = u = (r + u) / 2),
                a < o && (o = a = (o + a) / 2),
                    e.x0 = r,
                    e.y0 = o,
                    e.x1 = u,
                    e.y1 = a
            }
        }
        var e = 1
            , r = 1
            , i = 0
            , o = !1;
        return t.round = function(n) {
            return arguments.length ? (o = !!n,
                t) : o
        }
            ,
            t.size = function(n) {
                return arguments.length ? (e = +n[0],
                    r = +n[1],
                    t) : [e, r]
            }
            ,
            t.padding = function(n) {
                return arguments.length ? (i = +n,
                    t) : i
            }
            ,
            t
    }
    ,
    t.stratify = function() {
        function t(t) {
            var r, i, o, u, a, c, s, f = t.length, l = new Array(f), h = {};
            for (i = 0; i < f; ++i)
                r = t[i],
                    a = l[i] = new co(r),
                null != (c = n(r, i, t)) && (c += "") && (h[s = n_ + (a.id = c)] = s in h ? r_ : a);
            for (i = 0; i < f; ++i)
                if (a = l[i],
                    null != (c = e(t[i], i, t)) && (c += "")) {
                    if (!(u = h[n_ + c]))
                        throw new Error("missing: " + c);
                    if (u === r_)
                        throw new Error("ambiguous: " + c);
                    u.children ? u.children.push(a) : u.children = [a],
                        a.parent = u
                } else {
                    if (o)
                        throw new Error("multiple roots");
                    o = a
                }
            if (!o)
                throw new Error("no root");
            if (o.parent = e_,
                    o.eachBefore(function(t) {
                        t.depth = t.parent.depth + 1,
                            --f
                    }).eachBefore(ao),
                    o.parent = null,
                f > 0)
                throw new Error("cycle");
            return o
        }
        var n = zo
            , e = Po;
        return t.id = function(e) {
            return arguments.length ? (n = No(e),
                t) : n
        }
            ,
            t.parentId = function(n) {
                return arguments.length ? (e = No(n),
                    t) : e
            }
            ,
            t
    }
    ,
    t.tree = function() {
        function t(t) {
            var r = Io(t);
            if (r.eachAfter(n),
                    r.parent.m = -r.z,
                    r.eachBefore(e),
                    c)
                t.eachBefore(i);
            else {
                var s = t
                    , f = t
                    , l = t;
                t.eachBefore(function(t) {
                    t.x < s.x && (s = t),
                    t.x > f.x && (f = t),
                    t.depth > l.depth && (l = t)
                });
                var h = s === f ? 1 : o(s, f) / 2
                    , p = h - s.x
                    , d = u / (f.x + h + p)
                    , v = a / (l.depth || 1);
                t.eachBefore(function(t) {
                    t.x = (t.x + p) * d,
                        t.y = t.depth * v
                })
            }
            return t
        }
        function n(t) {
            var n = t.children
                , e = t.parent.children
                , i = t.i ? e[t.i - 1] : null;
            if (n) {
                Do(t);
                var u = (n[0].z + n[n.length - 1].z) / 2;
                i ? (t.z = i.z + o(t._, i._),
                    t.m = t.z - u) : t.z = u
            } else
                i && (t.z = i.z + o(t._, i._));
            t.parent.A = r(t, i, t.parent.A || e[0])
        }
        function e(t) {
            t._.x = t.z + t.parent.m,
                t.m += t.parent.m
        }
        function r(t, n, e) {
            if (n) {
                for (var r, i = t, u = t, a = n, c = i.parent.children[0], s = i.m, f = u.m, l = a.m, h = c.m; a = qo(a),
                    i = Lo(i),
                a && i; )
                    c = Lo(c),
                        (u = qo(u)).a = t,
                    (r = a.z + l - i.z - s + o(a._, i._)) > 0 && (Uo(Oo(a, t, e), t, r),
                        s += r,
                        f += r),
                        l += a.m,
                        s += i.m,
                        h += c.m,
                        f += u.m;
                a && !qo(u) && (u.t = a,
                    u.m += l - f),
                i && !Lo(c) && (c.t = i,
                    c.m += s - h,
                    e = t)
            }
            return e
        }
        function i(t) {
            t.x *= u,
                t.y = t.depth * a
        }
        var o = Ro
            , u = 1
            , a = 1
            , c = null;
        return t.separation = function(n) {
            return arguments.length ? (o = n,
                t) : o
        }
            ,
            t.size = function(n) {
                return arguments.length ? (c = !1,
                    u = +n[0],
                    a = +n[1],
                    t) : c ? null : [u, a]
            }
            ,
            t.nodeSize = function(n) {
                return arguments.length ? (c = !0,
                    u = +n[0],
                    a = +n[1],
                    t) : c ? [u, a] : null
            }
            ,
            t
    }
    ,
    t.treemap = function() {
        function t(t) {
            return t.x0 = t.y0 = 0,
                t.x1 = i,
                t.y1 = o,
                t.eachBefore(n),
                u = [0],
            r && t.eachBefore(Kv),
                t
        }
        function n(t) {
            var n = u[t.depth]
                , r = t.x0 + n
                , i = t.y0 + n
                , o = t.x1 - n
                , h = t.y1 - n;
            o < r && (r = o = (r + o) / 2),
            h < i && (i = h = (i + h) / 2),
                t.x0 = r,
                t.y0 = i,
                t.x1 = o,
                t.y1 = h,
            t.children && (n = u[t.depth + 1] = a(t) / 2,
                r += l(t) - n,
                i += c(t) - n,
                o -= s(t) - n,
                h -= f(t) - n,
            o < r && (r = o = (r + o) / 2),
            h < i && (i = h = (i + h) / 2),
                e(t, r, i, o, h))
        }
        var e = u_
            , r = !1
            , i = 1
            , o = 1
            , u = [0]
            , a = ko
            , c = ko
            , s = ko
            , f = ko
            , l = ko;
        return t.round = function(n) {
            return arguments.length ? (r = !!n,
                t) : r
        }
            ,
            t.size = function(n) {
                return arguments.length ? (i = +n[0],
                    o = +n[1],
                    t) : [i, o]
            }
            ,
            t.tile = function(n) {
                return arguments.length ? (e = No(n),
                    t) : e
            }
            ,
            t.padding = function(n) {
                return arguments.length ? t.paddingInner(n).paddingOuter(n) : t.paddingInner()
            }
            ,
            t.paddingInner = function(n) {
                return arguments.length ? (a = "function" == typeof n ? n : Qv(+n),
                    t) : a
            }
            ,
            t.paddingOuter = function(n) {
                return arguments.length ? t.paddingTop(n).paddingRight(n).paddingBottom(n).paddingLeft(n) : t.paddingTop()
            }
            ,
            t.paddingTop = function(n) {
                return arguments.length ? (c = "function" == typeof n ? n : Qv(+n),
                    t) : c
            }
            ,
            t.paddingRight = function(n) {
                return arguments.length ? (s = "function" == typeof n ? n : Qv(+n),
                    t) : s
            }
            ,
            t.paddingBottom = function(n) {
                return arguments.length ? (f = "function" == typeof n ? n : Qv(+n),
                    t) : f
            }
            ,
            t.paddingLeft = function(n) {
                return arguments.length ? (l = "function" == typeof n ? n : Qv(+n),
                    t) : l
            }
            ,
            t
    }
    ,
    t.treemapBinary = function(t, n, e, r, i) {
        function o(t, n, e, r, i, u, a) {
            if (t >= n - 1) {
                var s = c[t];
                return s.x0 = r,
                    s.y0 = i,
                    s.x1 = u,
                    void (s.y1 = a)
            }
            for (var l = f[t], h = e / 2 + l, p = t + 1, d = n - 1; p < d; ) {
                var v = p + d >>> 1;
                f[v] < h ? p = v + 1 : d = v
            }
            h - f[p - 1] < f[p] - h && t + 1 < p && --p;
            var _ = f[p] - l
                , g = e - _;
            if (u - r > a - i) {
                var y = (r * g + u * _) / e;
                o(t, p, _, r, i, y, a),
                    o(p, n, g, y, i, u, a)
            } else {
                var m = (i * g + a * _) / e;
                o(t, p, _, r, i, u, m),
                    o(p, n, g, r, m, u, a)
            }
        }
        var u, a, c = t.children, s = c.length, f = new Array(s + 1);
        for (f[0] = a = u = 0; u < s; ++u)
            f[u + 1] = a += c[u].value;
        o(0, s, t.value, n, e, r, i)
    }
    ,
    t.treemapDice = t_,
    t.treemapSlice = i_,
    t.treemapSliceDice = function(t, n, e, r, i) {
        (1 & t.depth ? i_ : t_)(t, n, e, r, i)
    }
    ,
    t.treemapSquarify = u_,
    t.treemapResquarify = a_,
    t.interpolate = fl,
    t.interpolateArray = rl,
    t.interpolateBasis = Jf,
    t.interpolateBasisClosed = Qf,
    t.interpolateDate = il,
    t.interpolateNumber = ol,
    t.interpolateObject = ul,
    t.interpolateRound = ll,
    t.interpolateString = sl,
    t.interpolateTransformCss = vl,
    t.interpolateTransformSvg = _l,
    t.interpolateZoom = yl,
    t.interpolateRgb = tl,
    t.interpolateRgbBasis = nl,
    t.interpolateRgbBasisClosed = el,
    t.interpolateHsl = ml,
    t.interpolateHslLong = xl,
    t.interpolateLab = function(t, n) {
        var e = Kt((t = Ut(t)).l, (n = Ut(n)).l)
            , r = Kt(t.a, n.a)
            , i = Kt(t.b, n.b)
            , o = Kt(t.opacity, n.opacity);
        return function(n) {
            return t.l = e(n),
                t.a = r(n),
                t.b = i(n),
                t.opacity = o(n),
            t + ""
        }
    }
    ,
    t.interpolateHcl = bl,
    t.interpolateHclLong = wl,
    t.interpolateCubehelix = Ml,
    t.interpolateCubehelixLong = Tl,
    t.quantize = function(t, n) {
        for (var e = new Array(n), r = 0; r < n; ++r)
            e[r] = t(r / (n - 1));
        return e
    }
    ,
    t.path = ve,
    t.polygonArea = function(t) {
        for (var n, e = -1, r = t.length, i = t[r - 1], o = 0; ++e < r; )
            n = i,
                i = t[e],
                o += n[1] * i[0] - n[0] * i[1];
        return o / 2
    }
    ,
    t.polygonCentroid = function(t) {
        for (var n, e, r = -1, i = t.length, o = 0, u = 0, a = t[i - 1], c = 0; ++r < i; )
            n = a,
                a = t[r],
                c += e = n[0] * a[1] - a[0] * n[1],
                o += (n[0] + a[0]) * e,
                u += (n[1] + a[1]) * e;
        return c *= 3,
            [o / c, u / c]
    }
    ,
    t.polygonHull = function(t) {
        if ((e = t.length) < 3)
            return null;
        var n, e, r = new Array(e), i = new Array(e);
        for (n = 0; n < e; ++n)
            r[n] = [+t[n][0], +t[n][1], n];
        for (r.sort(Bo),
                 n = 0; n < e; ++n)
            i[n] = [r[n][0], -r[n][1]];
        var o = jo(r)
            , u = jo(i)
            , a = u[0] === o[0]
            , c = u[u.length - 1] === o[o.length - 1]
            , s = [];
        for (n = o.length - 1; n >= 0; --n)
            s.push(t[r[o[n]][2]]);
        for (n = +a; n < u.length - c; ++n)
            s.push(t[r[u[n]][2]]);
        return s
    }
    ,
    t.polygonContains = function(t, n) {
        for (var e, r, i = t.length, o = t[i - 1], u = n[0], a = n[1], c = o[0], s = o[1], f = !1, l = 0; l < i; ++l)
            e = (o = t[l])[0],
            (r = o[1]) > a != s > a && u < (c - e) * (a - r) / (s - r) + e && (f = !f),
                c = e,
                s = r;
        return f
    }
    ,
    t.polygonLength = function(t) {
        for (var n, e, r = -1, i = t.length, o = t[i - 1], u = o[0], a = o[1], c = 0; ++r < i; )
            n = u,
                e = a,
                n -= u = (o = t[r])[0],
                e -= a = o[1],
                c += Math.sqrt(n * n + e * e);
        return c
    }
    ,
    t.quadtree = qe,
    t.queue = Go,
    t.randomUniform = h_,
    t.randomNormal = p_,
    t.randomLogNormal = d_,
    t.randomBates = __,
    t.randomIrwinHall = v_,
    t.randomExponential = g_,
    t.request = y_,
    t.html = x_,
    t.json = b_,
    t.text = w_,
    t.xml = M_,
    t.csv = N_,
    t.tsv = k_,
    t.scaleBand = nu,
    t.scalePoint = function() {
        return eu(nu().paddingInner(1))
    }
    ,
    t.scaleIdentity = hu,
    t.scaleLinear = lu,
    t.scaleLog = mu,
    t.scaleOrdinal = tu,
    t.scaleImplicit = C_,
    t.scalePow = bu,
    t.scaleSqrt = function() {
        return bu().exponent(.5)
    }
    ,
    t.scaleQuantile = wu,
    t.scaleQuantize = Mu,
    t.scaleThreshold = Tu,
    t.scaleTime = function() {
        return Ea(hg, fg, G_, W_, $_, H_, B_, O_, t.timeFormat).domain([new Date(2e3,0,1), new Date(2e3,0,2)])
    }
    ,
    t.scaleUtc = function() {
        return Ea(Ug, Lg, xg, yg, _g, dg, B_, O_, t.utcFormat).domain([Date.UTC(2e3, 0, 1), Date.UTC(2e3, 0, 2)])
    }
    ,
    t.schemeCategory10 = Kg,
    t.schemeCategory20b = ty,
    t.schemeCategory20c = ny,
    t.schemeCategory20 = ey,
    t.interpolateCubehelixDefault = ry,
    t.interpolateRainbow = function(t) {
        (t < 0 || t > 1) && (t -= Math.floor(t));
        var n = Math.abs(t - .5);
        return uy.h = 360 * t - 100,
            uy.s = 1.5 - 1.5 * n,
            uy.l = .8 - .9 * n,
        uy + ""
    }
    ,
    t.interpolateWarm = iy,
    t.interpolateCool = oy,
    t.interpolateViridis = ay,
    t.interpolateMagma = cy,
    t.interpolateInferno = sy,
    t.interpolatePlasma = fy,
    t.scaleSequential = Ca,
    t.creator = $s,
    t.local = m,
    t.matcher = Js,
    t.mouse = nf,
    t.namespace = Xs,
    t.namespaces = Hs,
    t.select = ff,
    t.selectAll = function(t) {
        return "string" == typeof t ? new pt([document.querySelectorAll(t)],[document.documentElement]) : new pt([null == t ? [] : t],sf)
    }
    ,
    t.selection = dt,
    t.selector = ef,
    t.selectorAll = rf,
    t.style = B,
    t.touch = lf,
    t.touches = function(t, n) {
        null == n && (n = Ks().touches);
        for (var e = 0, r = n ? n.length : 0, i = new Array(r); e < r; ++e)
            i[e] = tf(t, n[e]);
        return i
    }
    ,
    t.window = cf,
    t.customEvent = k,
    t.arc = function() {
        function t() {
            var t, s, f = +n.apply(this, arguments), l = +e.apply(this, arguments), h = o.apply(this, arguments) - by, p = u.apply(this, arguments) - by, d = hy(p - h), v = p > h;
            if (c || (c = t = ve()),
                l < f && (s = l,
                    l = f,
                    f = s),
                l > my)
                if (d > wy - my)
                    c.moveTo(l * dy(h), l * gy(h)),
                        c.arc(0, 0, l, h, p, !v),
                    f > my && (c.moveTo(f * dy(p), f * gy(p)),
                        c.arc(0, 0, f, p, h, v));
                else {
                    var _, g, y = h, m = p, x = h, b = p, w = d, M = d, T = a.apply(this, arguments) / 2, N = T > my && (i ? +i.apply(this, arguments) : yy(f * f + l * l)), k = _y(hy(l - f) / 2, +r.apply(this, arguments)), S = k, E = k;
                    if (N > my) {
                        var A = Pa(N / f * gy(T))
                            , C = Pa(N / l * gy(T));
                        (w -= 2 * A) > my ? (A *= v ? 1 : -1,
                            x += A,
                            b -= A) : (w = 0,
                            x = b = (h + p) / 2),
                            (M -= 2 * C) > my ? (C *= v ? 1 : -1,
                                y += C,
                                m -= C) : (M = 0,
                                y = m = (h + p) / 2)
                    }
                    var z = l * dy(y)
                        , P = l * gy(y)
                        , R = f * dy(b)
                        , L = f * gy(b);
                    if (k > my) {
                        var q = l * dy(m)
                            , U = l * gy(m)
                            , D = f * dy(x)
                            , O = f * gy(x);
                        if (d < xy) {
                            var F = w > my ? Oa(z, P, D, O, q, U, R, L) : [R, L]
                                , I = z - F[0]
                                , Y = P - F[1]
                                , B = q - F[0]
                                , j = U - F[1]
                                , H = 1 / gy(za((I * B + Y * j) / (yy(I * I + Y * Y) * yy(B * B + j * j))) / 2)
                                , X = yy(F[0] * F[0] + F[1] * F[1]);
                            S = _y(k, (f - X) / (H - 1)),
                                E = _y(k, (l - X) / (H + 1))
                        }
                    }
                    M > my ? E > my ? (_ = Fa(D, O, z, P, l, E, v),
                        g = Fa(q, U, R, L, l, E, v),
                        c.moveTo(_.cx + _.x01, _.cy + _.y01),
                        E < k ? c.arc(_.cx, _.cy, E, py(_.y01, _.x01), py(g.y01, g.x01), !v) : (c.arc(_.cx, _.cy, E, py(_.y01, _.x01), py(_.y11, _.x11), !v),
                            c.arc(0, 0, l, py(_.cy + _.y11, _.cx + _.x11), py(g.cy + g.y11, g.cx + g.x11), !v),
                            c.arc(g.cx, g.cy, E, py(g.y11, g.x11), py(g.y01, g.x01), !v))) : (c.moveTo(z, P),
                        c.arc(0, 0, l, y, m, !v)) : c.moveTo(z, P),
                        f > my && w > my ? S > my ? (_ = Fa(R, L, q, U, f, -S, v),
                            g = Fa(z, P, D, O, f, -S, v),
                            c.lineTo(_.cx + _.x01, _.cy + _.y01),
                            S < k ? c.arc(_.cx, _.cy, S, py(_.y01, _.x01), py(g.y01, g.x01), !v) : (c.arc(_.cx, _.cy, S, py(_.y01, _.x01), py(_.y11, _.x11), !v),
                                c.arc(0, 0, f, py(_.cy + _.y11, _.cx + _.x11), py(g.cy + g.y11, g.cx + g.x11), v),
                                c.arc(g.cx, g.cy, S, py(g.y11, g.x11), py(g.y01, g.x01), !v))) : c.arc(0, 0, f, b, x, v) : c.lineTo(R, L)
                }
            else
                c.moveTo(0, 0);
            if (c.closePath(),
                    t)
                return c = null,
                t + "" || null
        }
        var n = Ra
            , e = La
            , r = ly(0)
            , i = null
            , o = qa
            , u = Ua
            , a = Da
            , c = null;
        return t.centroid = function() {
            var t = (+n.apply(this, arguments) + +e.apply(this, arguments)) / 2
                , r = (+o.apply(this, arguments) + +u.apply(this, arguments)) / 2 - xy / 2;
            return [dy(r) * t, gy(r) * t]
        }
            ,
            t.innerRadius = function(e) {
                return arguments.length ? (n = "function" == typeof e ? e : ly(+e),
                    t) : n
            }
            ,
            t.outerRadius = function(n) {
                return arguments.length ? (e = "function" == typeof n ? n : ly(+n),
                    t) : e
            }
            ,
            t.cornerRadius = function(n) {
                return arguments.length ? (r = "function" == typeof n ? n : ly(+n),
                    t) : r
            }
            ,
            t.padRadius = function(n) {
                return arguments.length ? (i = null == n ? null : "function" == typeof n ? n : ly(+n),
                    t) : i
            }
            ,
            t.startAngle = function(n) {
                return arguments.length ? (o = "function" == typeof n ? n : ly(+n),
                    t) : o
            }
            ,
            t.endAngle = function(n) {
                return arguments.length ? (u = "function" == typeof n ? n : ly(+n),
                    t) : u
            }
            ,
            t.padAngle = function(n) {
                return arguments.length ? (a = "function" == typeof n ? n : ly(+n),
                    t) : a
            }
            ,
            t.context = function(n) {
                return arguments.length ? (c = null == n ? null : n,
                    t) : c
            }
            ,
            t
    }
    ,
    t.area = Ny,
    t.line = Ty,
    t.pie = function() {
        function t(t) {
            var a, c, s, f, l, h = t.length, p = 0, d = new Array(h), v = new Array(h), _ = +i.apply(this, arguments), g = Math.min(wy, Math.max(-wy, o.apply(this, arguments) - _)), y = Math.min(Math.abs(g) / h, u.apply(this, arguments)), m = y * (g < 0 ? -1 : 1);
            for (a = 0; a < h; ++a)
                (l = v[d[a] = a] = +n(t[a], a, t)) > 0 && (p += l);
            for (null != e ? d.sort(function(t, n) {
                return e(v[t], v[n])
            }) : null != r && d.sort(function(n, e) {
                return r(t[n], t[e])
            }),
                     a = 0,
                     s = p ? (g - h * m) / p : 0; a < h; ++a,
                     _ = f)
                c = d[a],
                    f = _ + ((l = v[c]) > 0 ? l * s : 0) + m,
                    v[c] = {
                        data: t[c],
                        index: a,
                        value: l,
                        startAngle: _,
                        endAngle: f,
                        padAngle: y
                    };
            return v
        }
        var n = Sy
            , e = ky
            , r = null
            , i = ly(0)
            , o = ly(wy)
            , u = ly(0);
        return t.value = function(e) {
            return arguments.length ? (n = "function" == typeof e ? e : ly(+e),
                t) : n
        }
            ,
            t.sortValues = function(n) {
                return arguments.length ? (e = n,
                    r = null,
                    t) : e
            }
            ,
            t.sort = function(n) {
                return arguments.length ? (r = n,
                    e = null,
                    t) : r
            }
            ,
            t.startAngle = function(n) {
                return arguments.length ? (i = "function" == typeof n ? n : ly(+n),
                    t) : i
            }
            ,
            t.endAngle = function(n) {
                return arguments.length ? (o = "function" == typeof n ? n : ly(+n),
                    t) : o
            }
            ,
            t.padAngle = function(n) {
                return arguments.length ? (u = "function" == typeof n ? n : ly(+n),
                    t) : u
            }
            ,
            t
    }
    ,
    t.areaRadial = Cy,
    t.radialArea = Cy,
    t.lineRadial = Ay,
    t.radialLine = Ay,
    t.pointRadial = zy,
    t.linkHorizontal = function() {
        return Wa(Za)
    }
    ,
    t.linkVertical = function() {
        return Wa(Ga)
    }
    ,
    t.linkRadial = function() {
        var t = Wa(Ja);
        return t.angle = t.x,
            delete t.x,
            t.radius = t.y,
            delete t.y,
            t
    }
    ,
    t.symbol = function() {
        function t() {
            var t;
            if (r || (r = t = ve()),
                    n.apply(this, arguments).draw(r, +e.apply(this, arguments)),
                    t)
                return r = null,
                t + "" || null
        }
        var n = ly(Ry)
            , e = ly(64)
            , r = null;
        return t.type = function(e) {
            return arguments.length ? (n = "function" == typeof e ? e : ly(e),
                t) : n
        }
            ,
            t.size = function(n) {
                return arguments.length ? (e = "function" == typeof n ? n : ly(+n),
                    t) : e
            }
            ,
            t.context = function(n) {
                return arguments.length ? (r = null == n ? null : n,
                    t) : r
            }
            ,
            t
    }
    ,
    t.symbols = Gy,
    t.symbolCircle = Ry,
    t.symbolCross = Ly,
    t.symbolDiamond = Dy,
    t.symbolSquare = By,
    t.symbolStar = Yy,
    t.symbolTriangle = Hy,
    t.symbolWye = Zy,
    t.curveBasisClosed = function(t) {
        return new tc(t)
    }
    ,
    t.curveBasisOpen = function(t) {
        return new nc(t)
    }
    ,
    t.curveBasis = function(t) {
        return new Ka(t)
    }
    ,
    t.curveBundle = Qy,
    t.curveCardinalClosed = tm,
    t.curveCardinalOpen = nm,
    t.curveCardinal = Ky,
    t.curveCatmullRomClosed = rm,
    t.curveCatmullRomOpen = im,
    t.curveCatmullRom = em,
    t.curveLinearClosed = function(t) {
        return new lc(t)
    }
    ,
    t.curveLinear = My,
    t.curveMonotoneX = function(t) {
        return new _c(t)
    }
    ,
    t.curveMonotoneY = function(t) {
        return new gc(t)
    }
    ,
    t.curveNatural = function(t) {
        return new mc(t)
    }
    ,
    t.curveStep = function(t) {
        return new bc(t,.5)
    }
    ,
    t.curveStepAfter = function(t) {
        return new bc(t,1)
    }
    ,
    t.curveStepBefore = function(t) {
        return new bc(t,0)
    }
    ,
    t.stack = function() {
        function t(t) {
            var o, u, a = n.apply(this, arguments), c = t.length, s = a.length, f = new Array(s);
            for (o = 0; o < s; ++o) {
                for (var l, h = a[o], p = f[o] = new Array(c), d = 0; d < c; ++d)
                    p[d] = l = [0, +i(t[d], h, d, t)],
                        l.data = t[d];
                p.key = h
            }
            for (o = 0,
                     u = e(f); o < s; ++o)
                f[u[o]].index = o;
            return r(f, u),
                f
        }
        var n = ly([])
            , e = um
            , r = om
            , i = wc;
        return t.keys = function(e) {
            return arguments.length ? (n = "function" == typeof e ? e : ly(Py.call(e)),
                t) : n
        }
            ,
            t.value = function(n) {
                return arguments.length ? (i = "function" == typeof n ? n : ly(+n),
                    t) : i
            }
            ,
            t.order = function(n) {
                return arguments.length ? (e = null == n ? um : "function" == typeof n ? n : ly(Py.call(n)),
                    t) : e
            }
            ,
            t.offset = function(n) {
                return arguments.length ? (r = null == n ? om : n,
                    t) : r
            }
            ,
            t
    }
    ,
    t.stackOffsetExpand = function(t, n) {
        if ((r = t.length) > 0) {
            for (var e, r, i, o = 0, u = t[0].length; o < u; ++o) {
                for (i = e = 0; e < r; ++e)
                    i += t[e][o][1] || 0;
                if (i)
                    for (e = 0; e < r; ++e)
                        t[e][o][1] /= i
            }
            om(t, n)
        }
    }
    ,
    t.stackOffsetDiverging = function(t, n) {
        if ((a = t.length) > 1)
            for (var e, r, i, o, u, a, c = 0, s = t[n[0]].length; c < s; ++c)
                for (o = u = 0,
                         e = 0; e < a; ++e)
                    (i = (r = t[n[e]][c])[1] - r[0]) >= 0 ? (r[0] = o,
                        r[1] = o += i) : i < 0 ? (r[1] = u,
                        r[0] = u += i) : r[0] = o
    }
    ,
    t.stackOffsetNone = om,
    t.stackOffsetSilhouette = function(t, n) {
        if ((e = t.length) > 0) {
            for (var e, r = 0, i = t[n[0]], o = i.length; r < o; ++r) {
                for (var u = 0, a = 0; u < e; ++u)
                    a += t[u][r][1] || 0;
                i[r][1] += i[r][0] = -a / 2
            }
            om(t, n)
        }
    }
    ,
    t.stackOffsetWiggle = function(t, n) {
        if ((i = t.length) > 0 && (r = (e = t[n[0]]).length) > 0) {
            for (var e, r, i, o = 0, u = 1; u < r; ++u) {
                for (var a = 0, c = 0, s = 0; a < i; ++a) {
                    for (var f = t[n[a]], l = f[u][1] || 0, h = (l - (f[u - 1][1] || 0)) / 2, p = 0; p < a; ++p) {
                        var d = t[n[p]];
                        h += (d[u][1] || 0) - (d[u - 1][1] || 0)
                    }
                    c += l,
                        s += h * l
                }
                e[u - 1][1] += e[u - 1][0] = o,
                c && (o -= s / c)
            }
            e[u - 1][1] += e[u - 1][0] = o,
                om(t, n)
        }
    }
    ,
    t.stackOrderAscending = am,
    t.stackOrderDescending = function(t) {
        return am(t).reverse()
    }
    ,
    t.stackOrderInsideOut = function(t) {
        var n, e, r = t.length, i = t.map(Mc), o = um(t).sort(function(t, n) {
            return i[n] - i[t]
        }), u = 0, a = 0, c = [], s = [];
        for (n = 0; n < r; ++n)
            e = o[n],
                u < a ? (u += i[e],
                    c.push(e)) : (a += i[e],
                    s.push(e));
        return s.reverse().concat(c)
    }
    ,
    t.stackOrderNone = um,
    t.stackOrderReverse = function(t) {
        return um(t).reverse()
    }
    ,
    t.timeInterval = Nu,
    t.timeMillisecond = O_,
    t.timeMilliseconds = F_,
    t.utcMillisecond = O_,
    t.utcMilliseconds = F_,
    t.timeSecond = B_,
    t.timeSeconds = j_,
    t.utcSecond = B_,
    t.utcSeconds = j_,
    t.timeMinute = H_,
    t.timeMinutes = X_,
    t.timeHour = $_,
    t.timeHours = V_,
    t.timeDay = W_,
    t.timeDays = Z_,
    t.timeWeek = G_,
    t.timeWeeks = rg,
    t.timeSunday = G_,
    t.timeSundays = rg,
    t.timeMonday = J_,
    t.timeMondays = ig,
    t.timeTuesday = Q_,
    t.timeTuesdays = og,
    t.timeWednesday = K_,
    t.timeWednesdays = ug,
    t.timeThursday = tg,
    t.timeThursdays = ag,
    t.timeFriday = ng,
    t.timeFridays = cg,
    t.timeSaturday = eg,
    t.timeSaturdays = sg,
    t.timeMonth = fg,
    t.timeMonths = lg,
    t.timeYear = hg,
    t.timeYears = pg,
    t.utcMinute = dg,
    t.utcMinutes = vg,
    t.utcHour = _g,
    t.utcHours = gg,
    t.utcDay = yg,
    t.utcDays = mg,
    t.utcWeek = xg,
    t.utcWeeks = Sg,
    t.utcSunday = xg,
    t.utcSundays = Sg,
    t.utcMonday = bg,
    t.utcMondays = Eg,
    t.utcTuesday = wg,
    t.utcTuesdays = Ag,
    t.utcWednesday = Mg,
    t.utcWednesdays = Cg,
    t.utcThursday = Tg,
    t.utcThursdays = zg,
    t.utcFriday = Ng,
    t.utcFridays = Pg,
    t.utcSaturday = kg,
    t.utcSaturdays = Rg,
    t.utcMonth = Lg,
    t.utcMonths = qg,
    t.utcYear = Ug,
    t.utcYears = Og,
    t.timeFormatDefaultLocale = Na,
    t.timeFormatLocale = zu,
    t.isoFormat = jg,
    t.isoParse = Hg,
    t.now = ln,
    t.timer = dn,
    t.timerFlush = vn,
    t.timeout = Ll,
    t.interval = function(t, n, e) {
        var r = new pn
            , i = n;
        return null == n ? (r.restart(t, n, e),
            r) : (n = +n,
            e = null == e ? ln() : +e,
            r.restart(function o(u) {
                u += i,
                    r.restart(o, i += n, e),
                    t(u)
            }, n, e),
            r)
    }
    ,
    t.transition = Jn,
    t.active = function(t, n) {
        var e, r, i = t.__transition;
        if (i) {
            n = null == n ? null : n + "";
            for (r in i)
                if ((e = i[r]).state > Ol && e.name === n)
                    return new Gn([[t]],mh,n,+r)
        }
        return null
    }
    ,
    t.interrupt = Xl,
    t.voronoi = function() {
        function t(t) {
            return new ns(t.map(function(r, i) {
                var o = [Math.round(n(r, i, t) / _m) * _m, Math.round(e(r, i, t) / _m) * _m];
                return o.index = i,
                    o.data = r,
                    o
            }),r)
        }
        var n = Tc
            , e = Nc
            , r = null;
        return t.polygons = function(n) {
            return t(n).polygons()
        }
            ,
            t.links = function(n) {
                return t(n).links()
            }
            ,
            t.triangles = function(n) {
                return t(n).triangles()
            }
            ,
            t.x = function(e) {
                return arguments.length ? (n = "function" == typeof e ? e : cm(+e),
                    t) : n
            }
            ,
            t.y = function(n) {
                return arguments.length ? (e = "function" == typeof n ? n : cm(+n),
                    t) : e
            }
            ,
            t.extent = function(n) {
                return arguments.length ? (r = null == n ? null : [[+n[0][0], +n[0][1]], [+n[1][0], +n[1][1]]],
                    t) : r && [[r[0][0], r[0][1]], [r[1][0], r[1][1]]]
            }
            ,
            t.size = function(n) {
                return arguments.length ? (r = null == n ? null : [[0, 0], [+n[0], +n[1]]],
                    t) : r && [r[1][0] - r[0][0], r[1][1] - r[0][1]]
            }
            ,
            t
    }
    ,
    t.zoom = function() {
        function n(t) {
            t.property("__zoom", cs).on("wheel.zoom", s).on("mousedown.zoom", f).on("dblclick.zoom", l).filter(b).on("touchstart.zoom", p).on("touchmove.zoom", d).on("touchend.zoom touchcancel.zoom", v).style("touch-action", "none").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)")
        }
        function e(t, n) {
            return (n = Math.max(w, Math.min(M, n))) === t.k ? t : new rs(n,t.x,t.y)
        }
        function r(t, n, e) {
            var r = n[0] - e[0] * t.k
                , i = n[1] - e[1] * t.k;
            return r === t.x && i === t.y ? t : new rs(t.k,r,i)
        }
        function i(t, n) {
            var e = t.invertX(n[0][0]) - T
                , r = t.invertX(n[1][0]) - N
                , i = t.invertY(n[0][1]) - S
                , o = t.invertY(n[1][1]) - E;
            return t.translate(r > e ? (e + r) / 2 : Math.min(0, e) || Math.max(0, r), o > i ? (i + o) / 2 : Math.min(0, i) || Math.max(0, o))
        }
        function o(t) {
            return [(+t[0][0] + +t[1][0]) / 2, (+t[0][1] + +t[1][1]) / 2]
        }
        function u(t, n, e) {
            t.on("start.zoom", function() {
                a(this, arguments).start()
            }).on("interrupt.zoom end.zoom", function() {
                a(this, arguments).end()
            }).tween("zoom", function() {
                var t = this
                    , r = arguments
                    , i = a(t, r)
                    , u = m.apply(t, r)
                    , c = e || o(u)
                    , s = Math.max(u[1][0] - u[0][0], u[1][1] - u[0][1])
                    , f = t.__zoom
                    , l = "function" == typeof n ? n.apply(t, r) : n
                    , h = C(f.invert(c).concat(s / f.k), l.invert(c).concat(s / l.k));
                return function(t) {
                    if (1 === t)
                        t = l;
                    else {
                        var n = h(t)
                            , e = s / n[2];
                        t = new rs(e,c[0] - n[0] * e,c[1] - n[1] * e)
                    }
                    i.zoom(null, t)
                }
            })
        }
        function a(t, n) {
            for (var e, r = 0, i = z.length; r < i; ++r)
                if ((e = z[r]).that === t)
                    return e;
            return new c(t,n)
        }
        function c(t, n) {
            this.that = t,
                this.args = n,
                this.index = -1,
                this.active = 0,
                this.extent = m.apply(t, n)
        }
        function s() {
            if (y.apply(this, arguments)) {
                var t = a(this, arguments)
                    , n = this.__zoom
                    , o = Math.max(w, Math.min(M, n.k * Math.pow(2, x.apply(this, arguments))))
                    , u = nf(this);
                if (t.wheel)
                    t.mouse[0][0] === u[0] && t.mouse[0][1] === u[1] || (t.mouse[1] = n.invert(t.mouse[0] = u)),
                        clearTimeout(t.wheel);
                else {
                    if (n.k === o)
                        return;
                    t.mouse = [u, n.invert(u)],
                        Xl(this),
                        t.start()
                }
                xm(),
                    t.wheel = setTimeout(function() {
                        t.wheel = null,
                            t.end()
                    }, L),
                    t.zoom("mouse", i(r(e(n, o), t.mouse[0], t.mouse[1]), t.extent))
            }
        }
        function f() {
            if (!g && y.apply(this, arguments)) {
                var n = a(this, arguments)
                    , e = ff(t.event.view).on("mousemove.zoom", function() {
                    if (xm(),
                            !n.moved) {
                        var e = t.event.clientX - u
                            , o = t.event.clientY - c;
                        n.moved = e * e + o * o > q
                    }
                    n.zoom("mouse", i(r(n.that.__zoom, n.mouse[0] = nf(n.that), n.mouse[1]), n.extent))
                }, !0).on("mouseup.zoom", function() {
                    e.on("mousemove.zoom mouseup.zoom", null),
                        _t(t.event.view, n.moved),
                        xm(),
                        n.end()
                }, !0)
                    , o = nf(this)
                    , u = t.event.clientX
                    , c = t.event.clientY;
                pf(t.event.view),
                    os(),
                    n.mouse = [o, this.__zoom.invert(o)],
                    Xl(this),
                    n.start()
            }
        }
        function l() {
            if (y.apply(this, arguments)) {
                var o = this.__zoom
                    , a = nf(this)
                    , c = o.invert(a)
                    , s = i(r(e(o, o.k * (t.event.shiftKey ? .5 : 2)), a, c), m.apply(this, arguments));
                xm(),
                    A > 0 ? ff(this).transition().duration(A).call(u, s, a) : ff(this).call(n.transform, s)
            }
        }
        function p() {
            if (y.apply(this, arguments)) {
                var n, e, r, i, o = a(this, arguments), u = t.event.changedTouches, c = u.length;
                for (os(),
                         e = 0; e < c; ++e)
                    r = u[e],
                        i = [i = lf(this, u, r.identifier), this.__zoom.invert(i), r.identifier],
                        o.touch0 ? o.touch1 || (o.touch1 = i) : (o.touch0 = i,
                            n = !0);
                if (_ && (_ = clearTimeout(_),
                        !o.touch1))
                    return o.end(),
                        void ((i = ff(this).on("dblclick.zoom")) && i.apply(this, arguments));
                n && (_ = setTimeout(function() {
                    _ = null
                }, R),
                    Xl(this),
                    o.start())
            }
        }
        function d() {
            var n, o, u, c, s = a(this, arguments), f = t.event.changedTouches, l = f.length;
            for (xm(),
                 _ && (_ = clearTimeout(_)),
                     n = 0; n < l; ++n)
                o = f[n],
                    u = lf(this, f, o.identifier),
                    s.touch0 && s.touch0[2] === o.identifier ? s.touch0[0] = u : s.touch1 && s.touch1[2] === o.identifier && (s.touch1[0] = u);
            if (o = s.that.__zoom,
                    s.touch1) {
                var h = s.touch0[0]
                    , p = s.touch0[1]
                    , d = s.touch1[0]
                    , v = s.touch1[1]
                    , g = (g = d[0] - h[0]) * g + (g = d[1] - h[1]) * g
                    , y = (y = v[0] - p[0]) * y + (y = v[1] - p[1]) * y;
                o = e(o, Math.sqrt(g / y)),
                    u = [(h[0] + d[0]) / 2, (h[1] + d[1]) / 2],
                    c = [(p[0] + v[0]) / 2, (p[1] + v[1]) / 2]
            } else {
                if (!s.touch0)
                    return;
                u = s.touch0[0],
                    c = s.touch0[1]
            }
            s.zoom("touch", i(r(o, u, c), s.extent))
        }
        function v() {
            var n, e, r = a(this, arguments), i = t.event.changedTouches, o = i.length;
            for (os(),
                 g && clearTimeout(g),
                     g = setTimeout(function() {
                         g = null
                     }, R),
                     n = 0; n < o; ++n)
                e = i[n],
                    r.touch0 && r.touch0[2] === e.identifier ? delete r.touch0 : r.touch1 && r.touch1[2] === e.identifier && delete r.touch1;
            r.touch1 && !r.touch0 && (r.touch0 = r.touch1,
                delete r.touch1),
                r.touch0 ? r.touch0[1] = this.__zoom.invert(r.touch0[0]) : r.end()
        }
        var _, g, y = us, m = as, x = ss, b = fs, w = 0, M = 1 / 0, T = -M, N = M, S = T, E = N, A = 250, C = yl, z = [], P = h("start", "zoom", "end"), R = 500, L = 150, q = 0;
        return n.transform = function(t, n) {
            var e = t.selection ? t.selection() : t;
            e.property("__zoom", cs),
                t !== e ? u(t, n) : e.interrupt().each(function() {
                    a(this, arguments).start().zoom(null, "function" == typeof n ? n.apply(this, arguments) : n).end()
                })
        }
            ,
            n.scaleBy = function(t, e) {
                n.scaleTo(t, function() {
                    return this.__zoom.k * ("function" == typeof e ? e.apply(this, arguments) : e)
                })
            }
            ,
            n.scaleTo = function(t, u) {
                n.transform(t, function() {
                    var t = m.apply(this, arguments)
                        , n = this.__zoom
                        , a = o(t)
                        , c = n.invert(a);
                    return i(r(e(n, "function" == typeof u ? u.apply(this, arguments) : u), a, c), t)
                })
            }
            ,
            n.translateBy = function(t, e, r) {
                n.transform(t, function() {
                    return i(this.__zoom.translate("function" == typeof e ? e.apply(this, arguments) : e, "function" == typeof r ? r.apply(this, arguments) : r), m.apply(this, arguments))
                })
            }
            ,
            n.translateTo = function(t, e, r) {
                n.transform(t, function() {
                    var t = m.apply(this, arguments)
                        , n = this.__zoom
                        , u = o(t);
                    return i(mm.translate(u[0], u[1]).scale(n.k).translate("function" == typeof e ? -e.apply(this, arguments) : -e, "function" == typeof r ? -r.apply(this, arguments) : -r), t)
                })
            }
            ,
            c.prototype = {
                start: function() {
                    return 1 == ++this.active && (this.index = z.push(this) - 1,
                        this.emit("start")),
                        this
                },
                zoom: function(t, n) {
                    return this.mouse && "mouse" !== t && (this.mouse[1] = n.invert(this.mouse[0])),
                    this.touch0 && "touch" !== t && (this.touch0[1] = n.invert(this.touch0[0])),
                    this.touch1 && "touch" !== t && (this.touch1[1] = n.invert(this.touch1[0])),
                        this.that.__zoom = n,
                        this.emit("zoom"),
                        this
                },
                end: function() {
                    return 0 == --this.active && (z.splice(this.index, 1),
                        this.index = -1,
                        this.emit("end")),
                        this
                },
                emit: function(t) {
                    k(new es(n,t,this.that.__zoom), P.apply, P, [t, this.that, this.args])
                }
            },
            n.wheelDelta = function(t) {
                return arguments.length ? (x = "function" == typeof t ? t : ym(+t),
                    n) : x
            }
            ,
            n.filter = function(t) {
                return arguments.length ? (y = "function" == typeof t ? t : ym(!!t),
                    n) : y
            }
            ,
            n.touchable = function(t) {
                return arguments.length ? (b = "function" == typeof t ? t : ym(!!t),
                    n) : b
            }
            ,
            n.extent = function(t) {
                return arguments.length ? (m = "function" == typeof t ? t : ym([[+t[0][0], +t[0][1]], [+t[1][0], +t[1][1]]]),
                    n) : m
            }
            ,
            n.scaleExtent = function(t) {
                return arguments.length ? (w = +t[0],
                    M = +t[1],
                    n) : [w, M]
            }
            ,
            n.translateExtent = function(t) {
                return arguments.length ? (T = +t[0][0],
                    N = +t[1][0],
                    S = +t[0][1],
                    E = +t[1][1],
                    n) : [[T, S], [N, E]]
            }
            ,
            n.duration = function(t) {
                return arguments.length ? (A = +t,
                    n) : A
            }
            ,
            n.interpolate = function(t) {
                return arguments.length ? (C = t,
                    n) : C
            }
            ,
            n.on = function() {
                var t = P.on.apply(P, arguments);
                return t === P ? n : t
            }
            ,
            n.clickDistance = function(t) {
                return arguments.length ? (q = (t = +t) * t,
                    n) : Math.sqrt(q)
            }
            ,
            n
    }
    ,
    t.zoomTransform = is,
    t.zoomIdentity = mm,
    Object.defineProperty(t, "__esModule", {
        value: !0
    })
});

//https://github.com/NPashaP/Viz
!function() {
    var t = {
        version: "1.4.0"
    }
        , e = 2 * Math.PI
        , n = Math.PI
        , r = Math.PI / 2;
    function a(t) {
        return t.height
    }
    function i(t) {
        return t.width
    }
    function o(t) {
        return t.height / 2
    }
    function u(t) {
        return t.width / 2
    }
    function c(t) {
        return t.key
    }
    function l(t) {
        var e;
        return function(n) {
            return arguments.length ? (e = n,
                t) : e
        }
    }
    function d(t, e) {
        var n;
        return function(r) {
            return arguments.length ? (n = r,
                t) : void 0 !== n ? n : e
        }
    }
    function s(t, e, n, r, a, i) {
        if (a <= 0 || r <= 0)
            return 0;
        var o = t.concat().sort(d3.ascending)
            , u = r - o.length * e + (i ? e : 0)
            , c = []
            , l = 0
            , d = 0;
        return d3.range(o.length).forEach(function(t) {
            d = (u - n * t) / (a -= o[t - 1] || 0),
                l += o[t] * d <= n ? 1 : 0,
                c.push(d)
        }),
            c[l]
    }
    function f(t, e, n, r, a) {
        var i = r
            , o = d3.sum(t)
            , u = s(t, e, n, a - r, o, !1);
        return t.map(function(t) {
            var r = u * t
                , a = (r < n ? n : r) / 2;
            return {
                c: (i += 2 * a + e) - a,
                v: r,
                w: a,
                value: t,
                percent: t / (o || 1)
            }
        })
    }
    function p(t) {
        function e(t, e) {
            return [t * Math.cos(e), t * Math.sin(e)]
        }
        var r = e(t[0], t[2])
            , a = e(t[0], t[3])
            , i = e(t[1], t[2])
            , o = e(t[1], t[3]);
        return ["M", r, "A", t[0], t[0], "0", t[3] - t[2] > n ? 1 : 0, "1", a, "L", o, "A", t[1], t[1], "0", t[3] - t[2] > n ? 1 : 0, "0", i, "z"].join(" ")
    }
    function h(t, r, a, i, o, u) {
        var c = p(t, r)
            , l = p(t, a)
            , d = p(i, o)
            , s = p(i, u);
        return "M" + c + f(t, l, a - r) + (r == o && a == u ? h(c, r, a, i) : h(d, a, o, i) + f(i, s, u - o) + h(c, r, u, t)) + "Z";
        function f(t, e, r) {
            return "A" + t + "," + t + " 0 " + +(r > n) + ",1 " + e
        }
        function p(t, e) {
            return [t * Math.cos(e), t * Math.sin(e)]
        }
        function h(t, r, a, i) {
            var o = (a += a < r ? e : 0) - r
                , u = 1 - (o > n ? e - o : o) / n;
            u = Math.pow(u, 5);
            var c = (a + r) / 2 - (a - r > n ? n : 0);
            return "Q" + u * i * Math.cos(c) + "," + u * i * Math.sin(c) + " " + t
        }
    }
    function v() {
        return d3.scaleOrdinal().range(d3.schemeCategory10)
    }
    function y(t, e) {
        ret = [];
        for (var n = e; n > e - t; n--)
            ret.push(n < 0 ? n + t : n);
        return ret
    }
    t.maps = {
        uscountyurl: "https://gist.githubusercontent.com/NPashaP/bf60b406b22a3bdf98f4483fddafdbb5/raw/5d9013e746e916eefe467750f7a11df91a3dc74f/us.json"
    },
        t.biPartite = function() {
            var t, e, n, r, a, i, o, u, c, l, d, s, f, p, h, g, v, y, m = !0;
            function b(t) {
                s = t,
                    x(),
                    y = b.bars(),
                    s.select(".viz-biPartite").remove();
                var e = s.append("g").attr("class", "viz-biPartite");
                e.selectAll(".viz-biPartite-subBar").data(y.subBars).enter().append("g").attr("transform", function(t) {
                    return "translate(" + t.x + "," + t.y + ")"
                }).attr("class", "viz-biPartite-subBar").append("rect").attr("x", A).attr("y", k).attr("width", w).attr("height", z).style("fill", function(t) {
                    return d(t)
                }),
                    e.selectAll(".viz-biPartite-edge").data(y.edges).enter().append("path").attr("class", "viz-biPartite-edge").attr("d", function(t) {
                        return t.path
                    }).style("fill-opacity", b.edgeOpacity()).style("fill", function(t) {
                        return d(t)
                    }),
                    e.selectAll(".viz-biPartite-mainBar").data(y.mainBars).enter().append("g").attr("transform", function(t) {
                        return "translate(" + t.x + "," + t.y + ")"
                    }).attr("class", "viz-biPartite-mainBar").append("rect").attr("x", A).attr("y", k).attr("width", w).attr("height", z).style("fill-opacity", 0).on("mouseover", b.mouseover).on("mouseout", b.mouseout)
            }
            function x() {
                m && (b.fill(),
                    b.keyPrimary(),
                    b.sortPrimary(),
                    b.keySecondary(),
                    b.sortSecondary(),
                    b.value(),
                    b.width(),
                    b.height(),
                    b.barSize(),
                    b.min(),
                    b.orient(),
                    b.pad(),
                    b.duration(),
                    b.edgeOpacity(),
                    b.edgeMode(),
                    m = !1)
            }
            function A(t) {
                return -t.width
            }
            function k(t) {
                return -t.height
            }
            function w(t) {
                return 2 * t.width
            }
            function z(t) {
                return 2 * t.height
            }
            return b.data = function(t) {
                return arguments.length ? (l = t,
                    m = !0,
                    b) : l
            }
                ,
                b.fill = function(t) {
                    return arguments.length ? (d = t,
                        m = !0,
                        b) : d || (e = d3.scaleOrdinal(d3.schemeCategory10),
                            d = function(t) {
                                return e(t.primary)
                            }
                    );
                    var e
                }
                ,
                b.keyPrimary = function(e) {
                    return arguments.length ? (t = e,
                        m = !0,
                        b) : t || (t = function(t) {
                            return t[0]
                        }
                    )
                }
                ,
                b.sortPrimary = function(t) {
                    return arguments.length ? (h = t,
                        m = !0,
                        b) : h || (h = d3.ascending)
                }
                ,
                b.keySecondary = function(t) {
                    return arguments.length ? (e = t,
                        m = !0,
                        b) : e || (e = function(t) {
                            return t[1]
                        }
                    )
                }
                ,
                b.sortSecondary = function(t) {
                    return arguments.length ? (g = t,
                        m = !0,
                        b) : g || (g = d3.ascending)
                }
                ,
                b.value = function(t) {
                    return arguments.length ? (n = t,
                        m = !0,
                        b) : n || (n = function(t) {
                            return t[2]
                        }
                    )
                }
                ,
                b.width = function(t) {
                    return arguments.length ? (r = t,
                        m = !0,
                        b) : r || (r = "vertical" == b.orient() ? 400 : 600)
                }
                ,
                b.height = function(t) {
                    return arguments.length ? (a = t,
                        m = !0,
                        b) : a || (a = "vertical" == b.orient() ? 600 : 400)
                }
                ,
                b.barSize = function(t) {
                    return arguments.length ? (o = t,
                        m = !0,
                        b) : o || (o = 35)
                }
                ,
                b.min = function(t) {
                    return arguments.length ? (u = t,
                        m = !0,
                        b) : void 0 === u ? u = 0 : u
                }
                ,
                b.orient = function(t) {
                    return arguments.length ? (i = t,
                        m = !0,
                        b) : void 0 === i ? i = "vertical" : i
                }
                ,
                b.pad = function(t) {
                    return arguments.length ? (c = t,
                        m = !0,
                        b) : void 0 === c ? c = 1 : c
                }
                ,
                b.duration = function(t) {
                    return arguments.length ? (p = t,
                        m = !0,
                        b) : void 0 === p ? p = 500 : p
                }
                ,
                b.edgeOpacity = function(t) {
                    return arguments.length ? (f = t,
                        m = !0,
                        b) : void 0 === f ? f = .4 : f
                }
                ,
                b.edgeMode = function(t) {
                    return arguments.length ? (v = t,
                        m = !0,
                        b) : v || (v = "curved")
                }
                ,
                b.bars = function(t) {
                    var e, n = {
                        primary: [],
                        secondary: []
                    }, r = {
                        primary: [],
                        secondary: []
                    }, a = {
                        primary: b.keyPrimary(),
                        secondary: b.keySecondary()
                    }, i = b.orient();
                    return u("primary"),
                        u("secondary"),
                        c("primary"),
                        c("secondary"),
                        e = b.min() / 2,
                        n.primary.forEach(function(t) {
                            t.height < e && (t.height = e)
                        }),
                        n.secondary.forEach(function(t) {
                            t.height < e && (t.height = e)
                        }),
                        {
                            mainBars: n.primary.concat(n.secondary),
                            subBars: r.primary.concat(r.secondary),
                            edges: function() {
                                var t = d3.map(r.secondary, function(t) {
                                    return t.index
                                })
                                    , e = b.edgeMode();
                                return r.primary.map(function(n) {
                                    var r = t.get(n.index);
                                    return {
                                        path: "vertical" === i ? function(t, n, r, a, i, o, u, c) {
                                            if ("straight" == e)
                                                return ["M", t, ",", n, "L", r, ",", a, "L", i, ",", o, "L", u, ",", c, "z"].join("");
                                            var l = (t + r) / 2
                                                , d = (i + u) / 2;
                                            return ["M", t, ",", n, "C", l, ",", n, " ", l, ",", a, ",", r, ",", a, "L", i, ",", o, "C", d, ",", o, " ", d, ",", c, ",", u, ",", c, "z"].join("")
                                        }(n.x + n.width, n.y + n.height, r.x - r.width, r.y + r.height, r.x - r.width, r.y - r.height, n.x + n.width, n.y - n.height) : function(t, n, r, a, i, o, u, c) {
                                            if ("straight" == e)
                                                return ["M", t, ",", n, "L", r, ",", a, "L", i, ",", o, "L", u, ",", c, "z"].join("");
                                            var l = (n + a) / 2
                                                , d = (o + c) / 2;
                                            return ["M", t, ",", n, "C", t, ",", l, " ", r, ",", l, ",", r, ",", a, "L", i, ",", o, "C", i, ",", d, " ", u, ",", d, ",", u, ",", c, "z"].join("")
                                        }(n.x - n.width, n.y + n.height, r.x - r.width, r.y - r.height, r.x + r.width, r.y - r.height, n.x + n.width, n.y + n.height),
                                        primary: n.primary,
                                        secondary: n.secondary,
                                        value: n.value,
                                        percent: n.percent
                                    }
                                })
                            }()
                        };
                    function o(e, n) {
                        return void 0 === t || t.part === n || a[t.part](e) === t.key
                    }
                    function u(t) {
                        function e(e) {
                            return o(e, t) ? b.value()(e) : 0
                        }
                        var r = d3.nest().key("primary" == t ? b.keyPrimary() : b.keySecondary()).sortKeys("primary" == t ? b.sortPrimary() : b.sortSecondary()).rollup(function(t) {
                            return d3.sum(t, e)
                        }).entries(l)
                            , a = d(r, b.pad(), b.min(), 0, "vertical" == i ? b.height() : b.width())
                            , u = b.barSize();
                        r.forEach(function(e, r) {
                            n[t].push({
                                x: "horizontal" == i ? (a[r].s + a[r].e) / 2 : "primary" == t ? u / 2 : b.width() - u / 2,
                                y: "vertical" == i ? (a[r].s + a[r].e) / 2 : "primary" == t ? u / 2 : b.height() - u / 2,
                                height: "vertical" == i ? (a[r].e - a[r].s) / 2 : u / 2,
                                width: "horizontal" == i ? (a[r].e - a[r].s) / 2 : u / 2,
                                part: t,
                                key: e.key,
                                value: e.value,
                                percent: a[r].p
                            })
                        })
                    }
                    function c(t) {
                        function e(e) {
                            return o(e, t) ? b.value()(e) : 0
                        }
                        var a = d3.map(n[t], function(t) {
                            return t.key
                        });
                        d3.nest().key("primary" == t ? b.keyPrimary() : b.keySecondary()).sortKeys("primary" == t ? b.sortPrimary() : b.sortSecondary()).key("secondary" == t ? b.keyPrimary() : b.keySecondary()).sortKeys("secondary" == t ? b.sortPrimary() : b.sortSecondary()).rollup(function(t) {
                            return d3.sum(t, e)
                        }).entries(b.data()).forEach(function(e) {
                            var n = a.get(e.key)
                                , o = d(e.values, 0, 0, "vertical" == i ? n.y - n.height : n.x - n.width, "vertical" == i ? n.y + n.height : n.x + n.width)
                                , u = b.barSize();
                            e.values.forEach(function(a, c) {
                                r[t].push({
                                    x: "vertical" == i ? "primary" == t ? u / 2 : b.width() - u / 2 : (o[c].s + o[c].e) / 2,
                                    y: "horizontal" == i ? "primary" == t ? u / 2 : b.height() - u / 2 : (o[c].s + o[c].e) / 2,
                                    height: ("vertical" == i ? o[c].e - o[c].s : u) / 2,
                                    width: ("horizontal" == i ? o[c].e - o[c].s : u) / 2,
                                    part: t,
                                    primary: "primary" == t ? e.key : a.key,
                                    secondary: "primary" == t ? a.key : e.key,
                                    value: a.value,
                                    percent: o[c].p * n.percent,
                                    index: "primary" == t ? e.key + "|" + a.key : a.key + "|" + e.key
                                })
                            })
                        })
                    }
                    function d(t, e, n, r, a) {
                        var i = n / (a - r - 2 * t.length * e)
                            , o = 0
                            , u = 0
                            , c = d3.sum(t, function(t) {
                            return t.value
                        });
                        t.forEach(function(t) {
                            t.value < i * c && (o += 1,
                                u += t.value)
                        });
                        var l = c < 1e-5 ? 0 : (a - r - 2 * t.length * e - o * n) / (c - u)
                            , d = r
                            , s = [];
                        return t.forEach(function(t) {
                            var r = t.value * l;
                            s.push({
                                s: d + e + (r < n ? .5 * (n - r) : 0),
                                e: d + e + (r < n ? .5 * (n + r) : r),
                                p: c < 1e-5 ? 0 : t.value / c
                            }),
                                d += 2 * e + (r < n ? n : r)
                        }),
                            s
                    }
                }
                ,
                b.update = function(t) {
                    return l = t,
                        x(),
                        y = b.bars(),
                        s.selectAll(".viz-biPartite-subBar").data(y.subBars).transition().duration(p).attr("transform", function(t) {
                            return "translate(" + t.x + "," + t.y + ")"
                        }).select("rect").attr("x", A).attr("y", k).attr("width", w).attr("height", z),
                        s.selectAll(".viz-biPartite-edge").data(y.edges).transition().duration(p).attr("d", function(t) {
                            return t.path
                        }).style("fill-opacity", b.edgeOpacity()),
                        s.selectAll(".viz-biPartite-mainBar").data(y.mainBars).transition().duration(p).attr("transform", function(t) {
                            return "translate(" + t.x + "," + t.y + ")"
                        }).select("rect").attr("x", A).attr("y", k).attr("width", w).attr("height", z).style("fill-opacity", 0),
                        b
                }
                ,
                b.mouseover = function(t) {
                    var e = b.bars(t);
                    s.selectAll(".viz-biPartite-mainBar").filter(function(e) {
                        return e.part === t.part && e.key === t.key
                    }).select("rect").style("stroke-opacity", 1),
                        s.selectAll(".viz-biPartite-subBar").data(e.subBars).transition().duration(b.duration()).attr("transform", function(t) {
                            return "translate(" + t.x + "," + t.y + ")"
                        }).select("rect").attr("x", A).attr("y", k).attr("width", w).attr("height", z);
                    var n = s.selectAll(".viz-biPartite-edge").data(e.edges);
                    n.filter(function(e) {
                        return e[t.part] === t.key
                    }).transition().duration(b.duration()).style("fill-opacity", b.edgeOpacity()).attr("d", function(t) {
                        return t.path
                    }),
                        n.filter(function(e) {
                            return e[t.part] !== t.key
                        }).transition().duration(b.duration()).style("fill-opacity", 0).attr("d", function(t) {
                            return t.path
                        }),
                        s.selectAll(".viz-biPartite-mainBar").data(e.mainBars).transition().duration(b.duration()).attr("transform", function(t) {
                            return "translate(" + t.x + "," + t.y + ")"
                        }).select("rect").attr("x", A).attr("y", k).attr("width", w).attr("height", z)
                }
                ,
                b.mouseout = function(t) {
                    s.selectAll(".viz-biPartite-mainBar").filter(function(e) {
                        return e.part === t.part && e.key === t.key
                    }).select("rect").style("stroke-opacity", 0),
                        s.selectAll(".viz-biPartite-subBar").data(y.subBars).transition().duration(b.duration()).attr("transform", function(t) {
                            return "translate(" + t.x + "," + t.y + ")"
                        }).select("rect").attr("x", A).attr("y", k).attr("width", w).attr("height", z),
                        s.selectAll(".viz-biPartite-edge").data(y.edges).transition().duration(b.duration()).style("fill-opacity", b.edgeOpacity()).attr("d", function(t) {
                            return t.path
                        }),
                        s.selectAll(".viz-biPartite-mainBar").data(y.mainBars).transition().duration(b.duration()).attr("transform", function(t) {
                            return "translate(" + t.x + "," + t.y + ")"
                        }).select("rect").attr("x", A).attr("y", k).attr("width", w).attr("height", z)
                }
                ,
                b
        }
        ,
        t.gg = function() {
            var e, r, a, i, o, u, c, l, d, s, f, p, h, g, v, y, m, b, x, A = {
                innerRadius: 20,
                outerRadius: 150,
                angleOffset: .7,
                startAngle: -1.5 * n,
                endAngle: .5 * n,
                minorTickStart: .9,
                minorTickEnd: .95,
                majorTickStart: .82,
                majorTickEnd: .95,
                needleColor: "#de2c2c",
                innerFaceColor: "#999999",
                faceColor: "#666666",
                domain: [0, 100],
                duration: 500,
                ease: "cubicInOut",
                ticks: d3.range(0, 101, 2),
                majorTicks: function(t) {
                    return t % 10 == 0
                },
                labelLocation: .7
            };
            function k(t) {
                f = t,
                    t.each(function() {
                        var t = d3.select(this)
                            , e = k.scale()
                            , r = k.minorTickStart()
                            , a = k.minorTickEnd()
                            , i = k.majorTickStart()
                            , o = k.majorTickEnd()
                            , u = k.ticks()
                            , c = k.majorTicks()
                            , l = k.labelLocation()
                            , d = k.outerRadius();
                        t.append("circle").attr("r", d).style("fill", "url(#vizgg3" + p + ")").attr("class", "face"),
                            t.append("circle").attr("r", k.innerRadius()).style("fill", "url(#vizgg2" + p + ")").style("filter", "url(#vizgg5" + p + ")").attr("class", "innerFace"),
                            t.append("g").selectAll("line").data(u).enter().append("line").attr("class", function(t) {
                                return c(t) ? "majorTicks" : "minorTicks"
                            }).attr("x1", function(t) {
                                return d * (c(t) ? i : r) * Math.cos(e(t))
                            }).attr("y1", function(t) {
                                return d * (c(t) ? i : r) * Math.sin(e(t))
                            }).attr("x2", function(t) {
                                return d * (c(t) ? o : a) * Math.cos(e(t))
                            }).attr("y2", function(t) {
                                return d * (c(t) ? o : a) * Math.sin(e(t))
                            }),
                            t.selectAll("text").data(u.filter(c)).enter().append("text").attr("class", "label").attr("x", function(t) {
                                return d * l * Math.cos(e(t))
                            }).attr("y", function(t) {
                                return d * l * Math.sin(e(t))
                            }).attr("dy", 3).text(function(t) {
                                return t
                            });
                        var s = k.outerRadius() / A.outerRadius
                            , f = 180 * k.scale()(k.value()) / n + 90;
                        t.append("g").attr("transform", "translate(1,1)").selectAll(".needleshadow").data([0]).enter().append("g").attr("transform", "rotate(" + f + ")").attr("class", "needleshadow").append("path").attr("d", ["m 0", -130 * s, 5 * s, 175 * s, -10 * s, "0,z"].join(",")).style("filter", "url(#vizgg6" + p + ")"),
                            t.selectAll(".needle").data([0]).enter().append("g").attr("transform", "rotate(" + f + ")").attr("class", "needle").append("polygon").attr("points", [-.5 * s, -130 * s, .5 * s, -130 * s, 5 * s, 45 * s, -5 * s, 45 * s].join(",")).style("fill", "url(#vizgg4" + p + ")")
                    })
            }
            return k.scale = function() {
                return d3.scale.linear().domain(k.domain()).range([A.startAngle + k.angleOffset(), A.endAngle - k.angleOffset()])
            }
                ,
                k.innerRadius = function(t) {
                    return arguments.length ? (e = t,
                        k) : void 0 !== e ? e : A.innerRadius
                }
                ,
                k.outerRadius = function(t) {
                    return arguments.length ? (r = t,
                        k) : void 0 !== r ? r : A.outerRadius
                }
                ,
                k.angleOffset = function(t) {
                    return arguments.length ? (l = t,
                        k) : void 0 !== l ? l : A.angleOffset
                }
                ,
                k.labelLocation = function(t) {
                    return arguments.length ? (x = t,
                        k) : void 0 !== x ? x : A.labelLocation
                }
                ,
                k.ticks = function(t) {
                    return arguments.length ? (h = t,
                        k) : void 0 !== h ? h : A.ticks
                }
                ,
                k.majorTicks = function(t) {
                    return arguments.length ? (g = t,
                        k) : void 0 !== g ? g : A.majorTicks
                }
                ,
                k.minorTickStart = function(t) {
                    return arguments.length ? (v = t,
                        k) : void 0 !== v ? v : A.minorTickStart
                }
                ,
                k.minorTickEnd = function(t) {
                    return arguments.length ? (y = t,
                        k) : void 0 !== y ? y : A.minorTickEnd
                }
                ,
                k.majorTickStart = function(t) {
                    return arguments.length ? (m = t,
                        k) : void 0 !== m ? m : A.majorTickStart
                }
                ,
                k.majorTickEnd = function(t) {
                    return arguments.length ? (b = t,
                        k) : void 0 !== b ? b : A.majorTickEnd
                }
                ,
                k.needleColor = function(t) {
                    return arguments.length ? (a = t,
                        k) : void 0 !== a ? a : A.needleColor
                }
                ,
                k.innerFaceColor = function(t) {
                    return arguments.length ? (i = t,
                        k) : void 0 !== i ? i : A.innerFaceColor
                }
                ,
                k.faceColor = function(t) {
                    return arguments.length ? (o = t,
                        k) : void 0 !== o ? o : A.faceColor
                }
                ,
                k.domain = function(t) {
                    return arguments.length ? (u = t,
                        k) : void 0 !== u ? u : A.domain
                }
                ,
                k.duration = function(t) {
                    return arguments.length ? (d = t,
                        k) : void 0 !== d ? d : A.duration
                }
                ,
                k.ease = function(t) {
                    return arguments.length ? (s = t,
                        k) : void 0 !== s ? s : A.ease
                }
                ,
                k.value = function(t) {
                    return arguments.length ? (c = t,
                        k) : void 0 !== c ? c : .5 * (A.domain[0] + A.domain[1])
                }
                ,
                k.defs = function(e, n) {
                    var r = e.append("defs");
                    p = n;
                    var a = k.needleColor()
                        , i = k.innerFaceColor()
                        , o = k.faceColor()
                        , u = t.defs(r).lG().id("vizgg1" + n).sel();
                    t.defs(u).stop().offset("0").stopColor(a),
                        t.defs(u).stop().offset("1").stopColor(d3.rgb(a).darker(1));
                    var c = t.defs(r).rG().id("vizgg2" + n).fx("35%").fy("65%").r("65%").spreadMethod("pad").sel();
                    t.defs(c).stop().offset("0").stopColor(i),
                        t.defs(c).stop().offset("1").stopColor(d3.rgb(i).darker(2));
                    var l = t.defs(r).rG().id("vizgg3" + n).fx("35%").fy("65%").r("65%").spreadMethod("pad").sel();
                    t.defs(l).stop().offset("0").stopColor(o),
                        t.defs(l).stop().offset("1").stopColor(d3.rgb(o).darker(2)),
                        t.defs(r).lG().id("vizgg4" + n).gradientUnits("userSpaceOnUse").y1("80").x1("-10").y2("80").x2("10").xlink("#vizgg1" + n);
                    var d = t.defs(r).filter().id("vizgg5" + n).sel();
                    t.defs(d).feFlood().result("flood").floodColor("rgb(0,0,0)").floodOpacity("0.6"),
                        t.defs(d).feComposite().result("composite1").operator("in").in2("SourceGraphic").in("flood"),
                        t.defs(d).feGaussianBlur().result("blur").stdDeviation("2").in("composite1"),
                        t.defs(d).feOffset().result("offset").dy("2").dx("2"),
                        t.defs(d).feComposite().result("composite2").operator("over").in2("offset").in("SourceGraphic");
                    var s = t.defs(r).filter().x("-0.3").y("-0.3").height("1.8").width("1.8").id("vizgg6" + n).sel();
                    t.defs(s).feGaussianBlur().stdDeviation("2")
                }
                ,
                k.setNeedle = function(t) {
                    var e = 180 * k.scale()(t) / n + 90
                        , r = 180 * k.scale()(k.value()) / n + 90
                        , a = k.ease();
                    function i(t, e) {
                        return d3.interpolateString("rotate(" + t + ")", "rotate(" + e + ")")
                    }
                    f.selectAll(".needle").data([t]).transition().duration(k.duration()).attrTween("transform", function(t) {
                        return i(r, e)
                    }).ease(a),
                        f.selectAll(".needleshadow").data([t]).transition().duration(k.duration()).attrTween("transform", function(t) {
                            return i(r, e)
                        }).ease(a).each("end", function() {
                            angle = t
                        }),
                        k.value(t)
                }
                ,
                k
        }
        ,
        t.chord = function() {
            var t, n, a, i, o, u, c, l, d, g, m, b, x, A, k, w, z, S, M, P = 0;
            function C(t) {
                k = t,
                    L(),
                    k.select(".viz-chord").remove();
                var a = k.append("g").attr("class", "viz-chord");
                a.append("g").attr("class", "viz-chord-groups").selectAll(".group").data(S).enter().append("path").attr("class", "group").on("mouseover", C.mouseover).on("mouseout", C.mouseout).style("fill", function(t) {
                    return n(t.source)
                }).style("stroke", function(t) {
                    return n(t.source)
                }).attr("d", function(t) {
                    return p([o, u, t.startAngle, t.endAngle])
                }).each(function(t) {
                    this._current = t
                }),
                    a.append("g").attr("class", "viz-chord-chords").selectAll(".chord").data(w).enter().append("path").attr("class", "chord").each(function(t) {
                        this._current = t
                    }).attr("d", function(t) {
                        return h(o, t.startAngle, t.endAngle, o, t.endStartAngle, t.endEndAngle)
                    }).style("fill", function(t) {
                        return n(t.target)
                    }).style("opacity", i).style("stroke", function(t) {
                        return n(t.target)
                    }).style("display", function(t) {
                        return t.display ? "inline" : "none"
                    }),
                    a.append("g").attr("class", "viz-chord-labels").selectAll(".label").data(S.filter(function(t) {
                        return "g" == t.type
                    })).enter().append("text").attr("class", "label").on("mouseover", C.mouseover).on("mouseout", C.mouseout).attr("x", function(t) {
                        return t.labelx
                    }).attr("y", function(t) {
                        return t.labely
                    }).text(A).style("text-anchor", function(t) {
                        var n = E(t);
                        return n < r || n > e - r ? "start" : "end"
                    }).each(function(t) {
                        this._current = t
                    })
            }
            function L() {
                keys = [],
                    C.source(),
                    C.target(),
                    C.sort(),
                    C.duration(),
                    C.chordOpacity(),
                    C.innerRadius(),
                    C.outerRadius(),
                    C.value(),
                    C.padAngle(),
                    C.labelPadding(),
                    C.sort(),
                    C.startAngle(),
                    C.label(),
                    C.fill(),
                    t.forEach(function(t) {
                        -1 == keys.indexOf(c(t)) && keys.push(c(t)),
                        -1 == keys.indexOf(l(t)) && keys.push(l(t))
                    }),
                    keys = keys.sort(b),
                    subgrp = {},
                    chordExist = {},
                    keys.forEach(function(t) {
                        subgrp[t] = {},
                            chordExist[t] = {},
                            keys.forEach(function(e) {
                                subgrp[t][e] = 0,
                                    chordExist[t][e] = !1
                            })
                    }),
                    t.forEach(function(t) {
                        var e = c(t)
                            , n = l(t);
                        subgrp[e][n] += d(t),
                            chordExist[e][n] = !0
                    }),
                    S = [],
                    keys.forEach(function(t, e) {
                        S.push({
                            source: t,
                            type: "gs",
                            value: 0,
                            skipPad: !0,
                            index: e
                        }),
                            S.push({
                                source: t,
                                type: "g",
                                value: d3.sum(keys, function(e) {
                                    return subgrp[t][e]
                                }),
                                skipPad: !1,
                                index: e
                            })
                    }),
                    _(S, g, P, void 0, x),
                    w = [],
                    S.filter(function(t) {
                        return "g" == t.type
                    }).forEach(function(t, e) {
                        var n = E(t);
                        t.labelx = m * u * Math.cos(n),
                            t.labely = m * u * Math.sin(n);
                        var r = y(keys.length, e)
                            , a = f(r.map(function(e) {
                            return subgrp[t.source][keys[e]]
                        }), 0, 0, t.startAngle, t.endAngle);
                        r.forEach(function(n, r) {
                            var i = a[r];
                            w.push({
                                startAngle: i.c - i.v / 2,
                                endAngle: i.c + i.v / 2,
                                value: i.value,
                                source: t.source,
                                target: keys[n],
                                type: "c",
                                display: chordExist[t.source][keys[n]],
                                index: e,
                                subindex: n,
                                indexsubindex: e + "-" + n
                            })
                        })
                    });
                var e = d3.map(w, function(t) {
                    return t.indexsubindex
                });
                w.forEach(function(t) {
                    if (t.subindex == t.index)
                        return t.endStartAngle = t.startAngle,
                            void (t.endEndAngle = t.startAngle);
                    var n = e.get(t.subindex + "-" + t.index);
                    t.endStartAngle = n.startAngle,
                        t.endEndAngle = n.startAngle
                }),
                    reComputeLayout = !1
            }
            function T(t) {
                var n = k.select(".viz-chord")
                    , c = t ? M : C.groups();
                n.select(".viz-chord-groups").selectAll(".group").data(c).transition().duration(a).attrTween("d", function(t) {
                    var e = d3.interpolate(this._current, t);
                    return this._current = e(0),
                        function(t) {
                            return n = e(t),
                                p([o, u, n.startAngle, n.endAngle]);
                            var n
                        }
                }),
                    n.select(".viz-chord-chords").selectAll(".chord").data(t ? z : C.chords()).transition().duration(a).attrTween("d", function(t) {
                        var e = d3.interpolate(this._current, t);
                        return this._current = e(0),
                            function(t) {
                                return n = e(t),
                                    h(o, n.startAngle, n.endAngle, o, n.endStartAngle, n.endEndAngle);
                                var n
                            }
                    }).style("opacity", function(t) {
                        return t.display ? i : 0
                    }),
                    n.select(".viz-chord-labels").selectAll(".label").data(c.filter(function(t) {
                        return "g" == t.type
                    })).transition().duration(a).attrTween("x", function(t) {
                        var e = d3.interpolate(this._current, t);
                        return this._current = e(0),
                            function(t) {
                                return m * u * Math.cos(E(e(t)))
                            }
                    }).attrTween("y", function(t) {
                        var e = d3.interpolate(this._current, t);
                        return this._current = e(0),
                            function(t) {
                                return m * u * Math.sin(E(e(t)))
                            }
                    }).text(A).style("text-anchor", function(t) {
                        var n = E(t);
                        return n < r || n > e - r ? "start" : "end"
                    })
            }
            function E(t) {
                return function(t) {
                    for (; t > e; )
                        t -= e;
                    for (; t < 0; )
                        t += e;
                    return t
                }((t.startAngle + t.endAngle) / 2)
            }
            function _(t, e, n, r, a) {
                var i = void 0 !== r
                    , o = 0;
                if (i) {
                    for (var u = !1; o < t.length; o++)
                        if (t[o].source == r && "g" == t[o].type) {
                            u = !0;
                            break
                        }
                    u || console.log("The fixed source '" + r + "' is not a valid key")
                }
                var c = d3.range(t.length);
                i && (c = c.slice(o).concat(c.slice(0, o)));
                var l = t.filter(function(t) {
                    return !(i && t.source === r && "g" == t.type || t.skipPad)
                }).map(function(t) {
                    return t.value
                })
                    , d = 2 * Math.PI - (i ? t[o].endAngle - t[o].startAngle + 2 * e : 0)
                    , f = i ? t[o].endAngle + e : a
                    , p = d3.sum(l)
                    , h = s(l, e, n, d <= 0 ? 0 : d, p, !!i);
                c.slice(i ? 1 : 0).forEach(function(r) {
                    var a = h * t[r].value
                        , i = (a < n ? n - a : 0) / 2;
                    t[r].startAngle = f,
                        t[r].endAngle = f + a,
                        t[r].padAngle = i,
                        t[r].percent = t[r].value / (p || 1),
                        f += a + i + (t[r].skipPad ? 0 : e)
                })
            }
            return C.data = function(e) {
                return arguments.length ? (t = e,
                    reComputeLayout = !0,
                    C) : t
            }
                ,
                C.fill = function(t) {
                    return arguments.length ? (n = t,
                        C) : void 0 !== n ? n : n = v()
                }
                ,
                C.duration = function(t) {
                    return arguments.length ? (a = t,
                        C) : void 0 !== a ? a : a = 500
                }
                ,
                C.chordOpacity = function(t) {
                    return arguments.length ? (i = t,
                        C) : void 0 !== i ? i : i = .7
                }
                ,
                C.innerRadius = function(t) {
                    return arguments.length ? (o = t,
                        reComputeLayout = !0,
                        C) : void 0 !== o ? o : o = 180
                }
                ,
                C.outerRadius = function(t) {
                    return arguments.length ? (u = t,
                        reComputeLayout = !0,
                        C) : void 0 !== u ? u : u = 200
                }
                ,
                C.source = function(t) {
                    return arguments.length ? (c = t,
                        reComputeLayout = !0,
                        C) : void 0 !== c ? c : c = function(t) {
                        return t[0]
                    }
                }
                ,
                C.target = function(t) {
                    return arguments.length ? (l = t,
                        reComputeLayout = !0,
                        C) : void 0 !== l ? l : l = function(t) {
                        return t[1]
                    }
                }
                ,
                C.value = function(t) {
                    return arguments.length ? (d = t,
                        reComputeLayout = !0,
                        C) : void 0 !== d ? d : d = function(t) {
                        return t[2]
                    }
                }
                ,
                C.padAngle = function(t) {
                    return arguments.length ? (g = t,
                        reComputeLayout = !0,
                        C) : void 0 !== g ? g : g = .03
                }
                ,
                C.labelPadding = function(t) {
                    return arguments.length ? (m = t,
                        C) : void 0 !== m ? m : m = 1.02
                }
                ,
                C.sort = function(t) {
                    return arguments.length ? (b = t,
                        reComputeLayout = !0,
                        C) : void 0 !== b ? b : b = d3.ascending
                }
                ,
                C.startAngle = function(t) {
                    return arguments.length ? (x = t,
                        reComputeLayout = !0,
                        C) : void 0 !== x ? x : x = 0
                }
                ,
                C.chords = function() {
                    return reComputeLayout && L(),
                        w
                }
                ,
                C.groups = function() {
                    return reComputeLayout && L(),
                        S
                }
                ,
                C.label = function(t) {
                    return arguments.length ? (A = t,
                        C) : void 0 !== A ? A : A = function(t) {
                        return t.source + " (" + t.value + ")"
                    }
                }
                ,
                C.mouseover = function(t) {
                    !function(t) {
                        var n = S.filter(function(e) {
                            return e.source == t && "g" == e.type
                        })[0];
                        function r(t) {
                            return t.endAngle + t.startAngle
                        }
                        M = [],
                            keys.forEach(function(e, r) {
                                M.push({
                                    source: e,
                                    startAngle: n.startAngle,
                                    endAngle: n.endAngle,
                                    padAngle: n.padAngle,
                                    percent: n.percent,
                                    type: "gs",
                                    value: e == t ? subgrp[e][e] : 0,
                                    skipPad: e != t || !chordExist[e][e],
                                    index: r
                                }),
                                    e == t ? M.push({
                                        source: e,
                                        startAngle: n.startAngle,
                                        endAngle: n.endAngle,
                                        padAngle: n.padAngle,
                                        percent: n.percent,
                                        type: "g",
                                        value: n.value,
                                        skipPad: !1,
                                        index: r
                                    }) : M.push({
                                        source: e,
                                        type: "g",
                                        value: subgrp[t][e],
                                        skipPad: !1,
                                        index: r
                                    })
                            }),
                            _(M, g, P, t, x);
                        var a = r(n);
                        S.forEach(function(t, n) {
                            var i = M[n]
                                , o = r(t) < a;
                            i.startAngle -= o ? e : 0,
                                i.endAngle -= o ? e : 0
                        }),
                            z = [],
                            M.filter(function(t) {
                                return "g" == t.type
                            }).forEach(function(e, n) {
                                var r = E(e);
                                e.labelx = m * u * Math.cos(r),
                                    e.labely = m * u * Math.sin(r);
                                var a = y(keys.length, n)
                                    , i = a.map(function(n) {
                                    var r = keys[n];
                                    return e.source == t ? subgrp[e.source][r] : r == t ? subgrp[r][e.source] : 0
                                })
                                    , o = f(i, 0, 0, e.startAngle, e.endAngle);
                                a.forEach(function(r, a) {
                                    var i = o[a];
                                    z.push({
                                        startAngle: i.c - i.v / 2,
                                        endAngle: i.c + i.v / 2,
                                        value: i.value,
                                        source: e.source,
                                        target: keys[r],
                                        type: "c",
                                        display: e.source === t,
                                        index: n,
                                        subindex: r,
                                        indexsubindex: n + "-" + r
                                    })
                                })
                            });
                        var i = d3.map(z.map(function(t) {
                            return {
                                startAngle: t.startAngle,
                                endAngle: t.endAngle,
                                indexsubindex: t.indexsubindex
                            }
                        }), function(t) {
                            return t.indexsubindex
                        })
                            , o = d3.map(M.filter(function(t) {
                            return "gs" == t.type
                        }), function(t) {
                            return t.source
                        });
                        z.forEach(function(e) {
                            if (e.subindex == e.index) {
                                var n = o.get(e.source);
                                return e.endStartAngle = n.startAngle,
                                    void (e.endEndAngle = n.endAngle)
                            }
                            var r = i.get(e.subindex + "-" + e.index);
                            e.endStartAngle = r.startAngle,
                                e.endEndAngle = r.endAngle,
                            e.source !== t && (e.startAngle = e.endAngle,
                                e.endEndAngle = e.endStartAngle)
                        })
                    }(t.source),
                        T(1)
                }
                ,
                C.mouseout = function(t) {
                    T(0)
                }
                ,
                C.update = function(e) {
                    t = e,
                        L(),
                        T(0)
                }
                ,
                C
        }
        ,
        t.defs = function(t) {
            var e = {}
                , n = t;
            return e.sel = function() {
                return n
            }
                ,
                e.lG = function() {
                    return n = n.append("linearGradient"),
                        e
                }
                ,
                e.rG = function() {
                    return n = n.append("radialGradient"),
                        e
                }
                ,
                e.stop = function() {
                    return n = n.append("stop"),
                        e
                }
                ,
                e.filter = function() {
                    return n = n.append("filter"),
                        e
                }
                ,
                e.feFlood = function() {
                    return n = n.append("feFlood"),
                        e
                }
                ,
                e.feComposite = function() {
                    return n = n.append("feComposite"),
                        e
                }
                ,
                e.feOffset = function() {
                    return n = n.append("feOffset"),
                        e
                }
                ,
                e.feGaussianBlur = function() {
                    return n = n.append("feGaussianBlur"),
                        e
                }
                ,
                e.result = function(t) {
                    return n = n.attr("result", t),
                        e
                }
                ,
                e.floodColor = function(t) {
                    return n = n.attr("flood-color", t),
                        e
                }
                ,
                e.floodOpacity = function(t) {
                    return n = n.attr("flood-opacity", t),
                        e
                }
                ,
                e.stdDeviation = function(t) {
                    return n = n.attr("stdDeviation", t),
                        e
                }
                ,
                e.operator = function(t) {
                    return n = n.attr("operator", t),
                        e
                }
                ,
                e.height = function(t) {
                    return n = n.attr("height", t),
                        e
                }
                ,
                e.width = function(t) {
                    return n = n.attr("width", t),
                        e
                }
                ,
                e.in = function(t) {
                    return n = n.attr("in", t),
                        e
                }
                ,
                e.in2 = function(t) {
                    return n = n.attr("in2", t),
                        e
                }
                ,
                e.id = function(t) {
                    return n = n.attr("id", t),
                        e
                }
                ,
                e.fx = function(t) {
                    return n = n.attr("fx", t),
                        e
                }
                ,
                e.fy = function(t) {
                    return n = n.attr("fy", t),
                        e
                }
                ,
                e.dx = function(t) {
                    return n = n.attr("dx", t),
                        e
                }
                ,
                e.dy = function(t) {
                    return n = n.attr("dy", t),
                        e
                }
                ,
                e.x1 = function(t) {
                    return n = n.attr("x1", t),
                        e
                }
                ,
                e.y1 = function(t) {
                    return n = n.attr("y1", t),
                        e
                }
                ,
                e.x2 = function(t) {
                    return n = n.attr("x2", t),
                        e
                }
                ,
                e.y2 = function(t) {
                    return n = n.attr("y2", t),
                        e
                }
                ,
                e.x = function(t) {
                    return n = n.attr("x", t),
                        e
                }
                ,
                e.y = function(t) {
                    return n = n.attr("y", t),
                        e
                }
                ,
                e.r = function(t) {
                    return n = n.attr("r", t),
                        e
                }
                ,
                e.spreadMethod = function(t) {
                    return n = n.attr("spreadMethod", t),
                        e
                }
                ,
                e.gradientUnits = function(t) {
                    return n = n.attr("gradientUnits", t),
                        e
                }
                ,
                e.xlink = function(t) {
                    return n = n.attr("xlink:href", t),
                        e
                }
                ,
                e.offset = function(t) {
                    return n = n.attr("offset", t),
                        e
                }
                ,
                e.stopColor = function(t) {
                    return n = n.attr("stop-color", t),
                        e
                }
                ,
                e.path = function() {
                    return n = n.append("path"),
                        e
                }
                ,
                e.d = function(t) {
                    return n = n.attr("d", t),
                        e
                }
                ,
                e
        }
        ,
        t.legend = function() {
            var t, e, n, r, l, d, s, f, p, h, g, v, y, m;
            function b(n) {
                (t = n).select(".viz-legend").remove(),
                    b.rows(),
                    legend_cols(),
                    b.width(),
                    b.height(),
                    b.paddingInner(),
                    b.paddingLabel(),
                    b.rowScale(),
                    b.colScale(),
                    b.size(),
                    b.fill(),
                    b.draw(),
                    b.onMouseOver(),
                    b.onMouseOut();
                var a = h.bandwidth()
                    , i = (g.bandwidth(),
                    d3.range(e.length).map(function(t) {
                        var n = t % r
                            , i = (t - n) / r;
                        return {
                            x: g(n),
                            y: h(i),
                            width: f,
                            height: a,
                            key: e[t]
                        }
                    }));
                t.append("g").attr("class", "viz-legend").selectAll(".legend-item").data(i).enter().append("g").attr("class", "legend-item").attr("transform", function(t) {
                    return "translate(" + t.x + "," + t.y + ")"
                }).on("mouseover", function(t) {
                    return m(t.key)
                }).on("mouseout", function(t) {
                    return y(t.key)
                }).each(v)
            }
            return b.data = function(t) {
                return arguments.length ? (e = t,
                    b) : e
            }
                ,
                b.rowScale = function(t) {
                    return void 0 !== h ? h : h = d3.scaleBand().domain(d3.range(b.rows())).range([0, b.height()]).paddingInner(b.paddingInner())
                }
                ,
                b.colScale = function(t) {
                    return void 0 !== g ? g : g = d3.scaleBand().domain(d3.range(legend_cols())).range([0, b.width()])
                }
                ,
                b.rows = function(t) {
                    return arguments.length ? (n = t,
                        b) : void 0 !== n ? Math.min(n, b.data().length) : n = b.data().length
                }
                ,
                legend_cols = function() {
                    return r = Math.ceil(b.data().length / (b.rows() > 0 ? n : 1))
                }
                ,
                b.width = function(t) {
                    return arguments.length ? (l = t,
                        b) : void 0 !== l ? l : l = 100
                }
                ,
                b.height = function(t) {
                    var e = b.rows();
                    return arguments.length ? (height = t,
                        b) : "undefined" != typeof height ? height : height = 12 * e + 12 * (e > 0 ? e - 1 : 0)
                }
                ,
                b.paddingInner = function(t) {
                    return arguments.length ? (d = t,
                        b) : void 0 !== d ? d : d = n > 1 ? .5 : 0
                }
                ,
                b.paddingLabel = function(t) {
                    return arguments.length ? (s = t,
                        b) : void 0 !== s ? s : s = 6
                }
                ,
                b.size = function(t) {
                    return arguments.length ? (f = t,
                        b) : void 0 !== f ? f : f = 12
                }
                ,
                b.onMouseOver = function(t) {
                    return arguments.length ? (m = t,
                        b) : void 0 !== m ? m : m = function() {}
                }
                ,
                b.onMouseOut = function(t) {
                    return arguments.length ? (y = t,
                        b) : void 0 !== y ? y : y = function() {}
                }
                ,
                b.fill = function(t) {
                    return arguments.length ? (p = t,
                        b) : void 0 !== p ? p : p = d3.scaleOrdinal().range(d3.schemeCategory10)
                }
                ,
                b.rect = function(t) {
                    d3.select(this).append("rect").attr("class", "legend-icon").attr("height", a).attr("width", i).style("fill", function(t) {
                        return p(t.key)
                    }),
                        d3.select(this).append("text").attr("x", function(t) {
                            return f + s
                        }).attr("y", o).attr("dy", 6).text(c)
                }
                ,
                b.circle = function(t) {
                    d3.select(this).append("circle").attr("class", "legend-icon").attr("r", 9).attr("cx", u).attr("cy", o).style("fill", function(t) {
                        return p(t.key)
                    }),
                        d3.select(this).append("text").attr("x", function(t) {
                            return f + s
                        }).attr("y", o).attr("dy", 6).text(c)
                }
                ,
                b.draw = function(t) {
                    return arguments.length ? (v = t,
                        b) : void 0 !== v ? v : v = b.rect
                }
                ,
                b
        }
        ,
        t.uscs = function() {
            function e(n) {
                g = n,
                    function() {
                        if (void 0 !== t.maps.uscounties.stateByAbb)
                            return;
                        t.maps.uscounties.stateByFIPS = {},
                            t.maps.uscounties.stateByAbb = {},
                            t.maps.uscounties.states.forEach(function(e) {
                                t.maps.uscounties.stateByFIPS[e.FP] = e,
                                    t.maps.uscounties.stateByAbb[e.ABB] = e
                            })
                    }(),
                    n.each(function() {
                        var n = d3.select(this)
                            , r = e.state()
                            , a = t.maps.uscounties.stateByAbb[r]
                            , i = t.maps.uscounties.objects.counties.geometries.filter(function(t) {
                            return t.properties.SFP === a.FP
                        })
                            , o = topojson.feature(t.maps.uscounties, {
                            type: "GeometryCollection",
                            geometries: i
                        }).features
                            , u = e.data();
                        if (void 0 !== u) {
                            var c = d3.map(u, e.countyFIPS());
                            o.forEach(function(t) {
                                t.data = c.get("" + t.properties.SFP + t.properties.CFP)
                            })
                        }
                        var l = d3.geoMercator().rotate(a.r).fitSize([e.width(), e.height()], topojson.merge(t.maps.uscounties, i))
                            , d = d3.geoPath().projection(l)
                            , s = n.append("g").attr("class", "counties")
                            , f = n.append("path").attr("class", "county-border")
                            , p = n.append("path").attr("class", "state-border")
                            , h = n.append("g").attr("class", "county-name");
                        p.datum(topojson.merge(t.maps.uscounties, i)).attr("d", d),
                            s = s.selectAll("path").data(o).enter().append("path").attr("d", d);
                        var g = e.fill();
                        void 0 !== g && s.style("fill", function(t) {
                            return g(t.data)
                        }),
                            h.selectAll("text").data(topojson.feature(t.maps.uscounties, {
                                type: "GeometryCollection",
                                geometries: i
                            }).features).enter().append("text").attr("transform", function(t) {
                                return "translate(" + l([t.properties.LON, t.properties.LAT]) + ")"
                            }).text(function(t) {
                                return t.properties.CNM
                            }),
                            f.datum(topojson.mesh(t.maps.uscounties, {
                                type: "GeometryCollection",
                                geometries: i
                            }, function(t, e) {
                                return t !== e
                            })).attr("d", d)
                    })
            }
            return e.data = l(e),
                e.state = l(e),
                e.width = d(e, 960),
                e.height = d(e, 960),
                e.fill = d(e, void 0),
                e.countyFIPS = d(e, function(t) {
                    return t[0]
                }),
                e
        }
        ,
        t.calendar = function() {
            var t, e, n, r, a, i, o, u, c, l, d = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], s = [3, 7, 11.5, 15.5, 20, 24.5, 28.5, 33.5, 37.5, 42, 46.5, 50.5], f = ["S", "M", "T", "W", "T", "F", "S"];
            function p(t) {
                g = t,
                    t.each(function() {
                        var t = d3.select(this)
                            , e = p.cellWidth()
                            , n = p.cellHeight()
                            , r = p.date()
                            , a = p.value()
                            , i = p.data()
                            , o = p.yearPadding()
                            , u = p.fill()
                            , c = p.valueLabel()
                            , l = t.selectAll(".cal-year").data(d3.range(p.minYear(), p.maxYear() + 1)).enter().append("g").attr("class", "cal-year").attr("transform", function(t, e) {
                            return "translate(0," + (o + 7 * n) * e + ")"
                        });
                        l.append("text").attr("transform", "translate(-6," + 3.5 * n + ")rotate(-90)").attr("class", "cal-year-label").text(function(t) {
                            return t
                        }),
                            l.filter(function(t, e) {
                                return !e
                            }).selectAll(".cal-month-label").data(d).enter().append("text").attr("class", "cal-month-label").attr("transform", function(t, n) {
                                return "translate(" + e * s[n] + ",-6)"
                            }).text(function(t) {
                                return t
                            }),
                            l.filter(function(t, e) {
                                return !e
                            }).selectAll(".cal-day-label").data(f).enter().append("text").attr("class", "cal-day-label").attr("transform", function(t, r) {
                                return "translate(" + (53 * e + 6) + "," + (n * (r + .5) + 6) + ")"
                            }).text(function(t) {
                                return t
                            });
                        var h = l.append("g").selectAll(".cal-day").data(function(t) {
                            return d3.timeDays(new Date(t,0,1), new Date(t + 1,0,1))
                        }).enter().append("g").attr("class", "cal-day cal-day-empty").attr("transform", function(t) {
                            return "translate(" + (d3.timeWeek.count(d3.timeYear(t), t) + .5) * e + "," + (t.getDay() + .5) * n + ")"
                        }).datum(function(t) {
                            return t
                        }).append("rect").attr("x", -.5 * e).attr("y", -.5 * n).attr("width", e).attr("height", n);
                        l.append("g").selectAll(".cal-month").data(function(t) {
                            return d3.timeMonths(new Date(t,0,1), new Date(t + 1,0,1))
                        }).enter().append("path").attr("class", "cal-month").attr("d", function(t) {
                            var r = new Date(t.getFullYear(),t.getMonth() + 1,0)
                                , a = t.getDay()
                                , i = d3.timeWeek.count(d3.timeYear(t), t)
                                , o = r.getDay()
                                , u = d3.timeWeek.count(d3.timeYear(r), r);
                            return "M" + (i + 1) * e + "," + a * n + "H" + i * e + "V" + 7 * n + "H" + u * e + "V" + (o + 1) * n + "H" + (u + 1) * e + "V0H" + (i + 1) * e + "Z"
                        });
                        var g = d3.nest().key(r).rollup(function(t) {
                            return a(t[0])
                        }).object(i);
                        h.filter(function(t) {
                            return t in g
                        }).attr("class", "cal-day cal-day-filled").style("fill", function(t) {
                            return u(g[t])
                        }).append("title").text(function(t) {
                            return d3.timeFormat("%Y-%m-%d")(t) + ": " + c(g[t])
                        })
                    })
            }
            return p.data = function(e) {
                return arguments.length ? (t = e,
                    p) : t
            }
                ,
                p.cellWidth = function(t) {
                    return arguments.length ? (o = t,
                        p) : void 0 !== o ? o : 17
                }
                ,
                p.cellHeight = function(t) {
                    return arguments.length ? (u = t,
                        p) : void 0 !== u ? u : 17
                }
                ,
                p.date = function(t) {
                    return arguments.length ? (e = t,
                        p) : void 0 !== e ? e : function(t) {
                        return t.date
                    }
                }
                ,
                p.value = function(t) {
                    return arguments.length ? (n = t,
                        p) : void 0 !== n ? n : function(t) {
                        return t.value
                    }
                }
                ,
                p.valueLabel = function(t) {
                    return arguments.length ? (l = t,
                        p) : void 0 !== l ? l : function(t) {
                        return t
                    }
                }
                ,
                p.fill = function(t) {
                    return arguments.length ? (r = t,
                        p) : void 0 !== r ? r : (e = p.value(),
                        d3.scaleLinear().domain(d3.extent(p.data().map(function(t) {
                            return e(t)
                        }))).range(["#deebf7", "#08306b"]));
                    var e
                }
                ,
                p.minYear = function(t) {
                    return arguments.length ? (a = t,
                        p) : void 0 !== a ? a : (e = p.date(),
                        d3.min(p.data().map(function(t) {
                            return e(t).getFullYear()
                        })));
                    var e
                }
                ,
                p.maxYear = function(t) {
                    return arguments.length ? (i = t,
                        p) : void 0 !== i ? i : (e = p.date(),
                        d3.max(p.data().map(function(t) {
                            return e(t).getFullYear()
                        })));
                    var e
                }
                ,
                p.yearPadding = function(t) {
                    return arguments.length ? (c = t,
                        p) : void 0 !== c ? c : 40
                }
                ,
                p
        }
        ,
        t.pc = function() {
            var t, e, n, r, a, i, o, u, c, l, d, s, f, p = {}, h = {};
            function g(u) {
                u,
                    u.each(function() {
                        var u = d3.select(this);
                        g.dimensionScale(),
                            g.width(),
                            g.height(),
                            g.outerPadding(),
                            g.dimensionScale(),
                            g.valueScale(),
                            g.dimensionAxes(),
                            g.brushSize(),
                            g.dimensionLabelPadding(),
                            e.forEach(function(t) {
                                h[t] = null
                            }),
                            d = u.append("g").attr("class", "background").selectAll("path").data(t).enter().append("path").attr("d", v),
                            s = u.append("g").attr("class", "foreground").selectAll("path").data(t).enter().append("path").attr("d", v);
                        var f = u.selectAll(".dimension").data(e).enter().append("g").attr("class", "dimension").attr("transform", function(t) {
                            return "translate(" + r(t) + ")"
                        }).call(d3.drag().on("start", function(t) {
                            p[t] = r(t),
                                d.attr("visibility", "hidden")
                        }).on("drag", function(t) {
                            p[t] = Math.min(i, Math.max(0, d3.event.x)),
                                s.attr("d", v),
                                e.sort(function(t, e) {
                                    return y(t) - y(e)
                                }),
                                r.domain(e),
                                f.attr("transform", function(t) {
                                    return "translate(" + y(t) + ")"
                                })
                        }).on("end", function(t) {
                            delete p[t],
                                d3.select(this).transition().duration(500).attr("transform", "translate(" + r(t) + ")"),
                                s.transition().duration(500).attr("d", v),
                                d.attr("d", v).transition().delay(500).duration(0).attr("visibility", null)
                        }));
                        function v(t) {
                            return g.path()(e.map(function(e) {
                                return [y(e), a[e](t[e])]
                            }))
                        }
                        function y(t) {
                            var e = p[t];
                            return null == e ? r(t) : e
                        }
                        function m() {
                            h[this.__data__] = d3.event.selection;
                            var t = e.filter(function(t) {
                                return h[t]
                            })
                                , n = t.map(function(t) {
                                return h[t].map(a[t].invert, a[t])
                            });
                            s.style("display", function(e) {
                                return t.every(function(t, r) {
                                    return n[r][1] <= e[t] && e[t] <= n[r][0]
                                }) ? null : "none"
                            })
                        }
                        f.append("g").attr("class", "axis").each(function(t) {
                            d3.select(this).call(c[t])
                        }).append("text").style("text-anchor", "middle").attr("y", n).text(function(t) {
                            return t
                        }),
                            f.append("g").attr("class", "brush").each(function(t) {
                                d3.select(this).call(a[t].brush = d3.brushY().extent([[-l / 2, 0], [l / 2, o]]).on("end", m))
                            })
                    })
            }
            return g.path = function(t) {
                return arguments.length ? (f = t,
                    g) : void 0 !== f ? f : f = g.bezier
            }
                ,
                g.bezier = function(t) {
                    var e = []
                        , n = g.brushSize();
                    return t.forEach(function(r, a) {
                        e.push(0 == a ? "M" + (r[0] - n) + "," + r[1] + "h" + 2 * n : "C" + (r[0] + t[a - 1][0]) / 2 + "," + t[a - 1][1] + " " + (r[0] + t[a - 1][0]) / 2 + "," + r[1] + "," + r[0] + "," + r[1] + "h" + n)
                    }),
                        e.join("")
                }
                ,
                g.lineSegments = function(t) {
                    var e = g.brushSize();
                    return t.map(function(t, n) {
                        return "M" + (t[0] - e) + "," + t[1] + "h" + 2 * e
                    }).join("")
                }
                ,
                g.data = function(e) {
                    return arguments.length ? (t = e,
                        g) : t
                }
                ,
                g.dimensions = function(n) {
                    return arguments.length ? (e = n,
                        g) : void 0 !== e ? e : e = d3.keys(t[0].sort(d3.ascending))
                }
                ,
                g.width = function(t) {
                    return arguments.length ? (i = t,
                        g) : void 0 !== i ? i : i = 900
                }
                ,
                g.height = function(t) {
                    return arguments.length ? (o = t,
                        g) : void 0 !== o ? o : o = 600
                }
                ,
                g.outerPadding = function(t) {
                    return arguments.length ? (u = t,
                        g) : void 0 !== u ? u : u = .1
                }
                ,
                g.dimensionScale = function(t) {
                    return arguments.length ? (r = t,
                        g) : void 0 !== r ? r : r = d3.scalePoint().padding(g.outerPadding()).range([0, g.width()]).domain(e)
                }
                ,
                g.valueScale = function(t) {
                    if (!arguments.length) {
                        if (void 0 !== a)
                            return a;
                        var e = {}
                            , n = g.data()
                            , r = g.height();
                        return g.dimensions().forEach(function(t) {
                            e[t] = d3.scaleLinear().domain(d3.extent(n, function(e) {
                                return +e[t]
                            })).range([r, 0])
                        }),
                            a = e
                    }
                    return a = t,
                        g
                }
                ,
                g.dimensionAxes = function(t) {
                    if (!arguments.length) {
                        var e = g.valueScale()
                            , n = {};
                        return void 0 !== c ? g.dimensions().forEach(function(t) {
                            n[t] = c[t].scale(e[t])
                        }) : g.dimensions().forEach(function(t) {
                            n[t] = d3.axisLeft().scale(e[t])
                        }),
                            c = n
                    }
                    return c = t,
                        g
                }
                ,
                g.brushSize = function(t) {
                    return arguments.length ? (l = t,
                        g) : void 0 !== l ? l : l = 12
                }
                ,
                g.dimensionLabelPadding = function(t) {
                    return arguments.length ? (n = t,
                        g) : void 0 !== n ? n : n = -9
                }
                ,
                g
        }
        ,
        t.area = function() {
            var t, e, n, r, a, i, o, u, c, l, d, s, f, p;
            function h(e) {
                (t = e).select(".viz-area").remove();
                var n = t.append("g").attr("class", "viz-area")
                    , r = h.points()
                    , a = d3.area().curve(h.curve()).defined(function(t) {
                    return t.defined
                }).x0(function(t) {
                    return t.x0
                }).x1(function(t) {
                    return t.x1
                }).y0(function(t) {
                    return t.y0
                }).y1(function(t) {
                    return t.y1
                });
                n.append("path").datum(r).attr("class", "area").attr("d", a)
            }
            return h.data = function(t) {
                return arguments.length ? (e = t,
                    h) : e
            }
                ,
                h.path = function() {
                    return d3.area().curve(h.curve()).defined(function(t) {
                        return t.defined
                    }).x0(function(t) {
                        return t.x0
                    }).x1(function(t) {
                        return t.x1
                    }).y0(function(t) {
                        return t.y0
                    }).y1(function(t) {
                        return t.y1
                    })(h.points())
                }
                ,
                h.transition = function() {
                    var e = t.select(".viz-area")
                        , n = h.points()
                        , r = d3.area().curve(h.curve()).defined(function(t) {
                        return t.defined
                    }).x0(function(t) {
                        return t.x0
                    }).x1(function(t) {
                        return t.x1
                    }).y0(function(t) {
                        return t.y0
                    }).y1(function(t) {
                        return t.y1
                    });
                    e.select(".area").datum(n).transition().duration(s).ease(f).attr("d", r)
                }
                ,
                h.curve = function(t) {
                    return arguments.length ? (d = t,
                        h) : void 0 !== d ? d : d = d3.curveLinear
                }
                ,
                h.duration = function(t) {
                    return arguments.length ? (s = t,
                        h) : void 0 !== s ? s : s = 1e3
                }
                ,
                h.ease = function(t) {
                    return arguments.length ? (f = t,
                        h) : void 0 !== f ? f : f = d3.easeLinear
                }
                ,
                h.width = function(t) {
                    return arguments.length ? (n = t,
                        h) : void 0 !== n ? n : (h.orient(),
                        n = "bottom" == p || "top" == p ? 880 : 420)
                }
                ,
                h.height = function(t) {
                    return arguments.length ? (r = t,
                        h) : void 0 !== r ? r : (h.orient(),
                        r = "bottom" == p || "top" == p ? 420 : 880)
                }
                ,
                h.key = function(t) {
                    return arguments.length ? (a = "function" == typeof t ? t : function() {
                        return t
                    }
                        ,
                        h) : a || (a = function(t) {
                            return t.key
                        }
                    )
                }
                ,
                h.value1 = function(t) {
                    return arguments.length ? (o = "function" == typeof t ? t : function() {
                        return +t
                    }
                        ,
                        h) : o || (o = function(t) {
                            return t.value
                        }
                    )
                }
                ,
                h.value0 = function(t) {
                    return arguments.length ? (i = "function" == typeof t ? t : function() {
                        return +t
                    }
                        ,
                        h) : i || (i = function(t) {
                            return 0
                        }
                    )
                }
                ,
                h.keyScale = function(t) {
                    if (arguments.length)
                        return u = t,
                            h;
                    var e = {
                        bottom: [0, h.width()],
                        top: [0, h.width()],
                        left: [0, h.height()],
                        right: [0, h.height()]
                    }[h.orient()];
                    return u || (u = d3.scaleLinear().domain(d3.extent(h.data().map(h.key()))).range(e))
                }
                ,
                h.valueScale = function(t) {
                    if (arguments.length)
                        return c = t,
                            h;
                    var e, n, r = {
                        bottom: [h.height(), 0],
                        top: [0, h.height()],
                        left: [0, h.width()],
                        right: [h.width(), 0]
                    }[h.orient()];
                    return c || (c = d3.scaleLinear().domain((e = d3.extent(h.data().map(h.value0())),
                        n = d3.extent(h.data().map(h.value1())),
                        [d3.min([e[0], n[0]]), d3.max([e[1], n[1]])])).range(r))
                }
                ,
                h.defined = function(t) {
                    return arguments.length ? (l = t,
                        h) : l || (l = function() {
                            return !0
                        }
                    )
                }
                ,
                h.orient = function(t) {
                    return arguments.length ? (p = t,
                        h) : p || (p = "bottom")
                }
                ,
                h.points = function() {
                    var t, e;
                    return h.orient(),
                        h.key(),
                        h.value0(),
                        h.value1(),
                        h.keyScale(),
                        h.valueScale(),
                        h.defined(),
                        h.duration(),
                        h.curve(),
                        h.ease(),
                        h.width(),
                        h.height(),
                        "bottom" == p || "top" == p ? (x0 = function(t, e) {
                                return u(a(t, e))
                            }
                                ,
                                x1 = function(t, e) {
                                    return u(a(t, e))
                                }
                                ,
                                t = function(t, e) {
                                    return c(i(t, e))
                                }
                                ,
                                e = function(t, e) {
                                    return c(o(t, e))
                                }
                        ) : (x0 = function(t, e) {
                                return c(i(t, e))
                            }
                                ,
                                x1 = function(t, e) {
                                    return c(o(t, e))
                                }
                                ,
                                t = function(t, e) {
                                    return u(a(t, e))
                                }
                                ,
                                e = function(t, e) {
                                    return u(a(t, e))
                                }
                        ),
                        h.data().map(function(n, r) {
                            var a = {
                                defined: l(n, r),
                                data: n
                            };
                            return a.x0 = a.defined ? x0(n, r) : u.range()[0],
                                a.x1 = a.defined ? x1(n, r) : u.range()[0],
                                a.y0 = a.defined ? t(n, r) : c.range()[0],
                                a.y1 = a.defined ? e(n, r) : c.range()[1],
                                a
                        })
                }
                ,
                h
        }
        ,
        t.line = function() {
            var t, e, n, r, a, i, o, u, c, l, d, s, f;
            function p(e) {
                (t = e).select(".viz-line").remove();
                var n = t.append("g").attr("class", "viz-line")
                    , r = p.points()
                    , a = d3.line().curve(p.curve()).defined(function(t) {
                    return t.defined
                }).x(function(t) {
                    return t.x
                }).y(function(t) {
                    return t.y
                });
                n.append("path").datum(r).attr("class", "line").attr("d", a)
            }
            return p.data = function(t) {
                return arguments.length ? (e = t,
                    refresh = !0,
                    p) : e
            }
                ,
                p.transition = function() {
                    var e = t.select(".viz-line")
                        , n = p.points()
                        , r = d3.line().curve(p.curve()).defined(function(t) {
                        return t.defined
                    }).x(function(t) {
                        return t.x
                    }).y(function(t) {
                        return t.y
                    });
                    e.select(".line").datum(n).transition().duration(d).ease(s).attr("d", r)
                }
                ,
                p.curve = function(t) {
                    return arguments.length ? (l = t,
                        p) : void 0 !== l ? l : l = d3.curveLinear
                }
                ,
                p.duration = function(t) {
                    return arguments.length ? (d = t,
                        p) : void 0 !== d ? d : d = 1e3
                }
                ,
                p.ease = function(t) {
                    return arguments.length ? (s = t,
                        p) : void 0 !== s ? s : s = d3.easeLinear
                }
                ,
                p.width = function(t) {
                    return arguments.length ? (n = t,
                        p) : void 0 !== n ? n : (p.orient(),
                        n = "bottom" == f || "top" == f ? 880 : 420)
                }
                ,
                p.height = function(t) {
                    return arguments.length ? (r = t,
                        p) : void 0 !== r ? r : (p.orient(),
                        r = "bottom" == f || "top" == f ? 420 : 880)
                }
                ,
                p.key = function(t) {
                    return arguments.length ? (a = t,
                        p) : void 0 !== a ? a : a = function(t) {
                        return t.key
                    }
                }
                ,
                p.value = function(t) {
                    return arguments.length ? (i = t,
                        p) : void 0 !== i ? i : i = function(t) {
                        return t.value
                    }
                }
                ,
                p.keyScale = function(t) {
                    if (arguments.length)
                        return o = t,
                            p;
                    var e = {
                        bottom: [0, p.width()],
                        top: [0, p.width()],
                        left: [0, p.height()],
                        right: [0, p.height()]
                    }[p.orient()];
                    return o || (o = d3.scaleLinear().domain(d3.extent(p.data().map(p.key()))).range(e))
                }
                ,
                p.valueScale = function(t) {
                    if (arguments.length)
                        return u = t,
                            p;
                    var e = {
                        bottom: [p.height(), 0],
                        top: [0, p.height()],
                        left: [0, p.width()],
                        right: [p.width(), 0]
                    }[p.orient()];
                    return u || (u = d3.scaleLinear().domain(d3.extent(p.data().map(p.value()))).range(e))
                }
                ,
                p.defined = function(t) {
                    return arguments.length ? (c = t,
                        p) : void 0 !== c ? i : c = function() {
                        return !0
                    }
                }
                ,
                p.orient = function(t) {
                    return arguments.length ? (f = t,
                        p) : f || (f = "bottom")
                }
                ,
                p.points = function() {
                    var t, e;
                    return p.orient(),
                        p.key(),
                        p.value(),
                        p.keyScale(),
                        p.valueScale(),
                        p.defined(),
                        p.duration(),
                        p.curve(),
                        p.ease(),
                        p.width(),
                        p.height(),
                        "bottom" == f || "top" == f ? (t = function(t, e) {
                                return o(a(t, e))
                            }
                                ,
                                e = function(t, e) {
                                    return u(i(t, e))
                                }
                        ) : (t = function(t, e) {
                                return u(i(t, e))
                            }
                                ,
                                e = function(t, e) {
                                    return o(a(t, e))
                                }
                        ),
                        p.data().map(function(n, r) {
                            var a = {
                                defined: c(n, r),
                                data: n
                            };
                            return a.x = t(n, r),
                                a.y = a.defined ? e(n, r) : u.range()[0],
                                a
                        })
                }
                ,
                p
        }
        ,
        t.point = function() {
            var t, e, n, r, a, i, o, u, c, l, d, s, f, p, h, g, v = !0, y = {
                bottom: 1,
                top: 2,
                left: 3,
                right: 4
            };
            function m(e) {
                (t = e).select(".viz-point").remove(),
                    t.append("g").attr("class", "viz-point").selectAll(".point").data(m.points()).enter().append("g").attr("class", "point").attr("transform", function(t) {
                        return "translate(" + t.x + "," + t.y + ")"
                    }).each(f)
            }
            function b() {
                v && (m.orient(),
                    m.key(),
                    m.value(),
                    m.keyScale(),
                    m.valueScale(),
                    m.defined(),
                    m.duration(),
                    m.curve(),
                    m.ease(),
                    m.width(),
                    m.height(),
                    m.drawPoints(),
                    h = m.data().map(function(t, e) {
                        var n = {
                            defined: c(t, e),
                            data: t,
                            selected: !1
                        };
                        return n.x = o(a(t, e)),
                            n.y = n.defined ? u(i(t, e)) : u.range()[0],
                            n
                    }),
                    p = d3.quadtree().x(function(t) {
                        return t.x
                    }).y(function(t) {
                        return t.y
                    }).addAll(h).extent([[o.range()[0], u.range()[0]], [o.range()[1] + 1, u.range()[1] + 1]]),
                    v = !1)
            }
            return m.transition = function() {
                t.select(".viz-point").selectAll(".point").data(m.points()).transition().duration(d).ease(s).attr("transform", function(t) {
                    return "translate(" + t.x + "," + t.y + ")"
                })
            }
                ,
                m.data = function(t) {
                    return arguments.length ? (e = t,
                        v = !0,
                        m) : e
                }
                ,
                m.orient = function(t) {
                    return arguments.length ? (g = y[t],
                        m) : g || (g = 1)
                }
                ,
                m.curve = function(t) {
                    return arguments.length ? (l = t,
                        m) : void 0 !== l ? l : l = d3.curveLinear
                }
                ,
                m.duration = function(t) {
                    return arguments.length ? (d = t,
                        m) : void 0 !== d ? d : d = 1e3
                }
                ,
                m.ease = function(t) {
                    return arguments.length ? (s = t,
                        m) : void 0 !== s ? s : s = d3.easeLinear
                }
                ,
                m.width = function(t) {
                    return arguments.length ? (n = t,
                        v = !0,
                        m) : void 0 !== n ? n : (v = !0,
                        n = 880)
                }
                ,
                m.height = function(t) {
                    return arguments.length ? (r = t,
                        v = !0,
                        m) : void 0 !== r ? r : (v = !0,
                        r = 420)
                }
                ,
                m.key = function(t) {
                    return arguments.length ? (a = t,
                        v = !0,
                        m) : a || (v = !0,
                            a = function(t) {
                                return t.key
                            }
                    )
                }
                ,
                m.value = function(t) {
                    return arguments.length ? (i = t,
                        v = !0,
                        m) : i || (v = !0,
                            i = function(t) {
                                return t.value
                            }
                    )
                }
                ,
                m.keyScale = function(t) {
                    if (!arguments.length) {
                        var e = {
                            1: [0, m.width()],
                            2: [0, m.width()],
                            3: [0, m.height()],
                            4: [0, m.height()]
                        }[g];
                        return o || (v = !0,
                            o = d3.scaleLinear().domain(d3.extent(m.data().map(m.key()))).range(e))
                    }
                    return o = t,
                        v = !0,
                        m
                }
                ,
                m.valueScale = function(t) {
                    if (!arguments.length) {
                        var e = {
                            1: [m.height(), 0],
                            2: [0, m.height()],
                            3: [0, m.width()],
                            4: [m.width(), 0]
                        }[g];
                        return u || (v = !0,
                            u = d3.scaleLinear().domain(d3.extent(m.data().map(m.value()))).range(e))
                    }
                    return u = t,
                        v = !0,
                        m
                }
                ,
                m.defined = function(t) {
                    return arguments.length ? (c = t,
                        v = !0,
                        m) : c || (v = !0,
                            c = function() {
                                return !0
                            }
                    )
                }
                ,
                m.drawPoints = function(t) {
                    return arguments.length ? (f = t,
                        m) : f || (f = function() {
                            d3.select(this).append("circle").attr("r", 6)
                        }
                    )
                }
                ,
                m.points = function() {
                    return b(),
                        h
                }
                ,
                m.tree = function() {
                    return b(),
                        p
                }
                ,
                m.filterRect = function(t) {
                    if (h.forEach(function(t) {
                            t.selected = !1
                        }),
                            !t)
                        return m;
                    var e = t[0][0]
                        , n = t[0][1]
                        , r = t[1][0]
                        , a = t[1][1];
                    return p.visit(function(t, i, o, u, c) {
                        var l = t.data;
                        return l && (l.selected = l.x >= e && l.x < r && l.y >= n && l.y < a),
                        i >= r || o >= a || u < e || c < n
                    }),
                        m
                }
                ,
                m
        }
        ,
        t.bar = function() {
            var t, e, n, r, a, i, o, u, c, l, d, s, f, p, h, g, v;
            function y(e) {
                (t = e).select(".viz-bar").remove(),
                    t.append("g").attr("class", "viz-bar").selectAll(".bar").data(y.bars()).enter().append("rect").attr("class", "bar").attr("x", function(t) {
                        return t.x
                    }).attr("y", function(t) {
                        return t.y
                    }).attr("width", function(t) {
                        return t.width
                    }).attr("height", function(t) {
                        return t.height
                    })
            }
            return y.data = function(t) {
                return arguments.length ? (e = t,
                    y) : e
            }
                ,
                y.transition = function() {
                    t.select(".viz-bar").selectAll(".bar").data(y.bars()).transition().duration(s).ease(f).attr("x", function(t) {
                        return t.x
                    }).attr("y", function(t) {
                        return t.y
                    }).attr("width", function(t) {
                        return t.width
                    }).attr("height", function(t) {
                        return t.height
                    })
                }
                ,
                y.curve = function(t) {
                    return arguments.length ? (d = t,
                        y) : void 0 !== d ? d : d = d3.curveLinear
                }
                ,
                y.duration = function(t) {
                    return arguments.length ? (s = t,
                        y) : void 0 !== s ? s : s = 1e3
                }
                ,
                y.ease = function(t) {
                    return arguments.length ? (f = t,
                        y) : void 0 !== f ? f : f = d3.easeLinear
                }
                ,
                y.width = function(t) {
                    return arguments.length ? (n = t,
                        y) : void 0 !== n ? n : (y.orient(),
                        n = 880)
                }
                ,
                y.height = function(t) {
                    return arguments.length ? (r = t,
                        y) : void 0 !== r ? r : (y.orient(),
                        r = 420)
                }
                ,
                y.key = function(t) {
                    return arguments.length ? (a = "function" == typeof t ? t : function() {
                        return t
                    }
                        ,
                        y) : a || (a = function(t) {
                            return t.key
                        }
                    )
                }
                ,
                y.value1 = function(t) {
                    return arguments.length ? (o = "function" == typeof t ? t : function() {
                        return +t
                    }
                        ,
                        y) : o || (o = function(t) {
                            return t.value
                        }
                    )
                }
                ,
                y.value0 = function(t) {
                    return arguments.length ? (i = "function" == typeof t ? t : function() {
                        return +t
                    }
                        ,
                        y) : i || (i = function(t) {
                            return 0
                        }
                    )
                }
                ,
                y.paddingInner = function(t) {
                    return arguments.length ? (h = t,
                        y) : void 0 !== h ? h : h = .1
                }
                ,
                y.paddingOuter = function(t) {
                    return arguments.length ? (g = t,
                        y) : void 0 !== g ? g : g = .1
                }
                ,
                y.align = function(t) {
                    return arguments.length ? (p = t,
                        y) : void 0 !== p ? p : p = .5
                }
                ,
                y.keyScale = function(t) {
                    if (arguments.length)
                        return u = t,
                            y;
                    var e = {
                        bottom: [0, y.width()],
                        top: [0, y.width()],
                        left: [0, y.height()],
                        right: [0, y.height()]
                    }[y.orient()];
                    return u || (u = d3.scaleBand().domain(y.data().map(y.key())).range(e).paddingInner(y.paddingInner()).paddingOuter(y.paddingOuter())).align(y.align())
                }
                ,
                y.valueScale = function(t) {
                    if (arguments.length)
                        return c = t,
                            y;
                    var e, n, r = {
                        bottom: [y.height(), 0],
                        top: [0, y.height()],
                        left: [0, y.width()],
                        right: [y.width(), 0]
                    }[y.orient()];
                    return c || (c = d3.scaleLinear().domain((e = d3.extent(y.data().map(y.value0())),
                        n = d3.extent(y.data().map(y.value1())),
                        [d3.min([e[0], n[0]]), d3.max([e[1], n[1]])])).range(r))
                }
                ,
                y.defined = function(t) {
                    return arguments.length ? (l = t,
                        y) : l || (l = function() {
                            return !0
                        }
                    )
                }
                ,
                y.orient = function(t) {
                    return arguments.length ? (v = t,
                        y) : v || (v = "bottom")
                }
                ,
                y.bars = function() {
                    var t, e, n, r;
                    return y.orient(),
                        y.key(),
                        y.value0(),
                        y.value1(),
                        y.keyScale(),
                        y.valueScale(),
                        y.defined(),
                        y.duration(),
                        y.curve(),
                        y.ease(),
                        y.width(),
                        y.height(),
                        "bottom" == v ? (t = function(t, e) {
                                return u(a(t, e))
                            }
                                ,
                                e = function(t, e) {
                                    return c(o(t, e))
                                }
                                ,
                                r = function(t, e) {
                                    return c(i(t, e)) - c(o(t, e))
                                }
                                ,
                                n = function(t, e) {
                                    return u.bandwidth()
                                }
                        ) : "top" == v ? (t = function(t, e) {
                                return u(a(t, e))
                            }
                                ,
                                e = function(t, e) {
                                    return c(i(t, e))
                                }
                                ,
                                r = function(t, e) {
                                    return c(o(t, e)) - c(i(t, e))
                                }
                                ,
                                n = function(t, e) {
                                    return u.bandwidth()
                                }
                        ) : "left" == v ? (t = function(t, e) {
                                return c(i(t, e))
                            }
                                ,
                                e = function(t, e) {
                                    return u(a(t, e))
                                }
                                ,
                                r = function(t, e) {
                                    return u.bandwidth()
                                }
                                ,
                                n = function(t, e) {
                                    return c(o(t, e)) - c(i(t, e))
                                }
                        ) : (t = function(t, e) {
                                return c(o(t, e))
                            }
                                ,
                                e = function(t, e) {
                                    return u(a(t, e))
                                }
                                ,
                                r = function(t, e) {
                                    return u.bandwidth()
                                }
                                ,
                                n = function(t, e) {
                                    return c(i(t, e)) - c(o(t, e))
                                }
                        ),
                        y.data().map(function(a, i) {
                            var o = {
                                defined: l(a, i),
                                data: a
                            };
                            return o.x = o.defined ? t(a, i) : u.range()[0],
                                o.y = o.defined ? e(a, i) : u.range()[0],
                                o.width = o.defined ? n(a, i) : c.range()[0],
                                o.height = o.defined ? r(a, i) : c.range()[1],
                                o
                        })
                }
                ,
                y
        }
        ,
        t.pie3d = function() {
            var t, r, a, i, o, u, c, l, d, s;
            function f(r) {
                t = r;
                var a = d3.pie().value(f.value()).startAngle(f.startAngle()).endAngle(e + f.startAngle())(f.data())
                    , i = t.append("g").attr("class", "viz-pie3d")
                    , o = f.fill();
                i.selectAll(".innerSlice").data(a).enter().append("path").attr("class", "innerSlice").style("fill", function(t) {
                    return d3.hsl(o(t.data)).darker(.7)
                }).attr("d", function(t) {
                    var e = t.startAngle < n ? n : t.startAngle
                        , r = t.endAngle < n ? n : t.endAngle
                        , a = f.eccentricity()
                        , i = f.innerRadius()
                        , o = a * i
                        , u = f.height()
                        , c = i * Math.cos(e)
                        , l = o * Math.sin(e)
                        , d = i * Math.cos(r)
                        , s = o * Math.sin(r);
                    return ["M", c, l, "A", i, o, "0 0 1", d, s, "L", d, u + s, "A", i, o, "0 0 0", c, u + l, "z"].join(" ")
                }).each(function(t) {
                    this._current = t
                }),
                    i.selectAll(".topSlice").data(a).enter().append("path").attr("class", "topSlice").style("fill", function(t) {
                        return o(t.data)
                    }).style("stroke", function(t) {
                        return o(t.data)
                    }).attr("d", function(t) {
                        if (t.endAngle - t.startAngle == 0)
                            return "M 0 0";
                        var e = f.eccentricity()
                            , r = f.outerRadius()
                            , a = e * r
                            , i = f.innerRadius() / r
                            , o = r * Math.cos(t.startAngle)
                            , u = a * Math.sin(t.startAngle)
                            , c = r * Math.cos(t.endAngle)
                            , l = a * Math.sin(t.endAngle);
                        return ["M", o, u, "A", r, a, "0", t.endAngle - t.startAngle > n ? 1 : 0, "1", c, l, "L", i * c, i * l, "A", i * r, i * a, "0", t.endAngle - t.startAngle > n ? 1 : 0, "0", i * o, i * u, "z"].join(" ")
                    }).each(function(t) {
                        this._current = t
                    }),
                    i.selectAll(".outerSlice").data(a).enter().append("path").attr("class", "outerSlice").style("fill", function(t) {
                        return d3.hsl(o(t.data)).darker(.7)
                    }).attr("d", function(t) {
                        var e = t.startAngle > n ? n : t.startAngle
                            , r = t.endAngle > n ? n : t.endAngle
                            , a = f.eccentricity()
                            , i = f.outerRadius()
                            , o = a * i
                            , u = (f.innerRadius(),
                            f.height())
                            , c = i * Math.cos(e)
                            , l = o * Math.sin(e)
                            , d = i * Math.cos(r)
                            , s = o * Math.sin(r);
                        return ["M", c, u + l, "A", i, o, "0 0 1", d, u + s, "L", d, s, "A", i, o, "0 0 0", c, l, "z"].join(" ")
                    }).each(function(t) {
                        this._current = t
                    });
                var u = (f.outerRadius() + f.innerRadius()) / 2
                    , c = f.eccentricity() * u;
                i.selectAll(".label").data(a).enter().append("text").attr("class", "label").attr("x", function(t) {
                    return u * Math.cos(.5 * (t.startAngle + t.endAngle))
                }).attr("y", function(t) {
                    return c * Math.sin(.5 * (t.startAngle + t.endAngle))
                }).attr("dy", 6).text(function(t) {
                    return f.label()(t)
                }).each(function(t) {
                    this._current = t
                })
            }
            return f.data = function(t) {
                return arguments.length ? (r = t,
                    f) : r
            }
                ,
                f.value = function(t) {
                    return arguments.length ? (o = "function" == typeof t ? t : function(e) {
                        return +t
                    }
                        ,
                        f) : void 0 !== o ? o : o = function(t) {
                        return t
                    }
                }
                ,
                f.label = function(t) {
                    return arguments.length ? (s = "function" == typeof t ? t : function(e) {
                        return t
                    }
                        ,
                        f) : void 0 !== s ? s : s = function(t) {
                        return ""
                    }
                }
                ,
                f.fill = function(t) {
                    return arguments.length ? (u = t,
                        f) : void 0 !== u ? u : u = v()
                }
                ,
                f.height = function(t) {
                    return arguments.length ? (d = t,
                        f) : void 0 !== d ? d : d = 30
                }
                ,
                f.innerRadius = function(t) {
                    return arguments.length ? (a = t,
                        f) : void 0 !== a ? a : a = 0
                }
                ,
                f.outerRadius = function(t) {
                    return arguments.length ? (i = t,
                        f) : void 0 !== i ? i : i = 200
                }
                ,
                f.eccentricity = function(t) {
                    return arguments.length ? (l = t,
                        f) : void 0 !== l ? l : l = .8
                }
                ,
                f.startAngle = function(t) {
                    return arguments.length ? (c = t,
                        f) : void 0 !== c ? c : c = 0
                }
                ,
                f
        }
        ,
        t.pie = function() {
            var t, e, n, r, a, i, o, u, c, l, d, s, f, p, h = !1;
            function g(e) {
                t = e,
                    e.each(function() {
                        d3.select(this).select(".viz-pie").remove();
                        var t = d3.select(this).append("g").attr("class", "viz-pie")
                            , e = g.fill()
                            , n = g.label()
                            , r = g.d3pie()(g.data())
                            , a = g.arc();
                        h && (a = a.startAngle(g.startAngle()).endAngle(g.startAngle())),
                            t.append("g").attr("class", "arcs").selectAll(".arc").data(r).enter().append("path").attr("class", "arc").attr("d", a).style("fill", function(t) {
                                return e(t.data)
                            }),
                            t.append("g").attr("class", "labels").selectAll(".label").data(r).enter().append("text").attr("class", "label").attr("transform", function(t) {
                                return "translate(" + a.centroid(t) + ")"
                            }).attr("dy", "0.35em").text(function(t) {
                                return h ? "" : n(t.data)
                            })
                    })
            }
            return g.fold = function() {
                h || (t.each(function() {
                    var t = d3.select(this).select(".viz-pie")
                        , e = g.duration()
                        , n = g.arc()
                        , r = (g.label(),
                        g.ease());
                    t.select(".arcs").selectAll(".arc").transition().duration(e).attrTween("d", function(t) {
                        var e = g.startAngle()(t.data)
                            , a = d3.interpolate(t.startAngle, e)
                            , i = d3.interpolate(t.endAngle, e);
                        return function(e) {
                            return t.startAngle = a(r(e)),
                                t.endAngle = i(r(e)),
                                n(t)
                        }
                    }),
                        t.select(".labels").selectAll(".label").text(function(t) {
                            return ""
                        })
                }),
                    h = !0)
            }
                ,
                g.unfold = function() {
                    h && (t.each(function() {
                        var t = d3.select(this).select(".viz-pie")
                            , e = g.duration()
                            , n = g.arc()
                            , r = g.label()
                            , a = g.d3pie()(g.data())
                            , i = g.ease();
                        t.select(".arcs").selectAll(".arc").data(a).transition().duration(e).attrTween("d", function(t) {
                            var e = g.startAngle()(t.data)
                                , r = d3.interpolate(e, t.startAngle)
                                , a = d3.interpolate(e, t.endAngle);
                            return function(e) {
                                return t.startAngle = r(i(e)),
                                    t.endAngle = a(i(e)),
                                    n(t)
                            }
                        }),
                            t.select(".labels").selectAll(".label").data(a).attr("transform", function(t) {
                                return "translate(" + n.centroid(t) + ")"
                            }).transition().delay(e).text(function(t) {
                                return r(t.data)
                            })
                    }),
                        h = !1)
                }
                ,
                g.createFolded = function() {
                    return h = !0,
                        g
                }
                ,
                g.data = function(t) {
                    return arguments.length ? (e = t,
                        g) : e
                }
                ,
                g.value = function(t) {
                    return arguments.length ? (c = "function" == typeof t ? t : function(e) {
                        return +t
                    }
                        ,
                        g) : void 0 !== c ? c : function(t) {
                        return t
                    }
                }
                ,
                g.innerRadius = function(t) {
                    return arguments.length ? (n = "function" == typeof t ? t : function(e) {
                        return +t
                    }
                        ,
                        g) : void 0 !== n ? n : function(t) {
                        return 0
                    }
                }
                ,
                g.outerRadius = function(t) {
                    return arguments.length ? (r = "function" == typeof t ? t : function(e) {
                        return +t
                    }
                        ,
                        g) : void 0 !== r ? r : function(t) {
                        return 200
                    }
                }
                ,
                g.cornerRadius = function(t) {
                    return arguments.length ? (a = "function" == typeof t ? t : function(e) {
                        return +t
                    }
                        ,
                        g) : void 0 !== a ? a : function(t) {
                        return 0
                    }
                }
                ,
                g.startAngle = function(t) {
                    return arguments.length ? (i = "function" == typeof t ? t : function(e) {
                        return +t
                    }
                        ,
                        g) : void 0 !== i ? i : function(t) {
                        return 0
                    }
                }
                ,
                g.endAngle = function(t) {
                    return arguments.length ? (o = "function" == typeof t ? t : function(e) {
                        return +t
                    }
                        ,
                        g) : void 0 !== o ? o : function(t) {
                        return g.startAngle()(t) + 2 * Math.PI
                    }
                }
                ,
                g.padAngle = function(t) {
                    return arguments.length ? (u = "function" == typeof t ? t : function(e) {
                        return +t
                    }
                        ,
                        g) : void 0 !== u ? u : function(t) {
                        return 0
                    }
                }
                ,
                g.fill = function(t) {
                    return arguments.length ? (l = t,
                        g) : void 0 !== l ? l : l = v()
                }
                ,
                g.sort = function(t) {
                    return arguments.length ? (d = t,
                        g) : void 0 !== d ? d : null
                }
                ,
                g.label = function(t) {
                    return arguments.length ? (s = t,
                        g) : void 0 !== s ? s : function(t) {
                        return ""
                    }
                }
                ,
                g.duration = function(t) {
                    return arguments.length ? (p = t,
                        g) : void 0 !== p ? p : 500
                }
                ,
                g.ease = function(t) {
                    return arguments.length ? (f = t,
                        g) : void 0 !== f ? f : d3.easeCubicInOut
                }
                ,
                g.arc = function() {
                    return d3.arc().outerRadius(g.outerRadius()).innerRadius(g.innerRadius()).cornerRadius(g.cornerRadius())
                }
                ,
                g.d3pie = function() {
                    return d3.pie().sort(g.sort()).startAngle(g.startAngle()).endAngle(g.endAngle()).padAngle(g.padAngle()).value(g.value())
                }
                ,
                g
        }
        ,
        t.form = {},
        t.form.select = function() {
            var t, e, n, r, a;
            function i(e) {
                t = e,
                    e.selectAll("option").remove(),
                    e.selectAll("option").data(i.data()).enter().append("option").property("value", i.value()).text(i.text()),
                    e.on("change", i.onChange())
            }
            return i.data = function(t) {
                return arguments.length ? (e = t,
                    i) : e
            }
                ,
                i.value = function(t) {
                    return arguments.length ? (n = t,
                        i) : n || (n = function(t) {
                            return t
                        }
                    )
                }
                ,
                i.text = function(t) {
                    return arguments.length ? (r = t,
                        i) : r || (r = function(t) {
                            return t
                        }
                    )
                }
                ,
                i.onChange = function(t) {
                    return arguments.length ? (a = function() {
                        t(i.get())
                    }
                        ,
                        i) : a || (a = function() {}
                    )
                }
                ,
                i.set = function(e) {
                    return t.property("value", e),
                        i
                }
                ,
                i.get = function() {
                    return t.property("value")
                }
                ,
                i.update = function(n) {
                    return e = n,
                        t.selectAll("option").remove(),
                        t.selectAll("option").data(n).enter().append("option").property("value", i.value()).text(i.text()),
                        t.on("change", i.onChange()),
                        i
                }
                ,
                i
        }
        ,
        t.form.checkList = function() {
            var t, e, n, r, a, i, o, u, c, l;
            function d(t) {
                e = t,
                    u = d.data().map(d.defaultCheck()),
                    e.classed("button-group", !0).classed("dropdown", !0).append("button").attr("class", "btn btn-secondary  dropdown-toggle").attr("data-toggle", "dropdown").text(d.buttonLabel()),
                    $(e.node()).on("hidden.bs.dropdown", d.onHidden());
                var n = e.append("ul").attr("class", "dropdown-menu");
                d.allNoneButton() && n.append("li").attr("class", "buttons").append("div").attr("class", "row").selectAll("button").data(["All", "None"]).enter().append("button").attr("type", "button").attr("class", "btn btn-secondary btn-sm col-3").text(function(t) {
                    return t
                }).on("click", f);
                n.selectAll(".list").data(d.data()).enter().append("li").attr("class", "list").append("a").on("click", s).attr("href", "#").attr("class", "dropdown-item").attr("data-value", d.dataValue()).attr("tabIndex", "-1").each(function(t) {
                    d3.select(this).append("input").attr("type", "checkbox").property("checked", d.defaultCheck())
                }).append("span").text(d.optionLabel())
            }
            function s(t, e) {
                var n = d.data().indexOf(t);
                d3.select(this).select("input").property("checked", u[n] = !u[n]),
                    d.onClick()(t, e),
                    d3.event.stopPropagation()
            }
            function f(t) {
                u = "All" == t ? d.data().map(function(t) {
                    return !0
                }) : d.data().map(function(t) {
                    return !1
                }),
                    e.selectAll(".list").select("input").property("checked", function(t, e) {
                        return u[e]
                    }),
                    d3.event.stopPropagation()
            }
            return d.data = function(e) {
                return arguments.length ? (t = e,
                    d) : t
            }
                ,
                d.buttonLabel = function(t) {
                    return arguments.length ? (n = t,
                        d) : void 0 !== n ? n : n = "Options"
                }
                ,
                d.allNoneButton = function(t) {
                    return arguments.length ? (l = t,
                        d) : void 0 !== l ? l : l = !0
                }
                ,
                d.optionLabel = function(t) {
                    return arguments.length ? (r = t,
                        d) : void 0 !== r ? r : r = function(t) {
                        return t
                    }
                }
                ,
                d.onClick = function(t) {
                    return arguments.length ? (a = t,
                        d) : void 0 !== a ? a : a = function(t) {}
                }
                ,
                d.onHidden = function(t) {
                    return arguments.length ? (c = t,
                        d) : void 0 !== c ? c : c = function(t) {}
                }
                ,
                d.dataValue = function(t) {
                    return arguments.length ? (i = t,
                        d) : void 0 !== i ? i : i = function(t) {
                        return t
                    }
                }
                ,
                d.defaultCheck = function(t) {
                    return arguments.length ? (o = t,
                        d) : void 0 !== o ? o : o = function(t) {
                        return !0
                    }
                }
                ,
                d.selectionList = function() {
                    return d.data().map(function(t, e) {
                        return u[e]
                    })
                }
                ,
                d
        }
        ,
        t.table = function() {
            var t, e;
            function n(t) {
                g = t,
                    t.each(function() {
                        var t = d3.select(this);
                        t.append("thead").append("tr").selectAll("th").data(n.header()).enter().append("th").text(function(t) {
                            return t
                        }),
                            t.append("tbody").selectAll("tr").data(n.body()).enter().append("tr").selectAll("td").data(function(t) {
                                return t
                            }).enter().append("td").text(function(t) {
                                return t
                            }),
                            t.append("tfoot").append("tr").selectAll("th").data(n.footer()).enter().append("th").text(function(t) {
                                return t
                            })
                    })
            }
            return n.body = function(t) {
                return arguments.length ? (tbody = t,
                    n) : tbody
            }
                ,
                n.header = function(e) {
                    return arguments.length ? (t = e,
                        n) : void 0 !== t ? t : []
                }
                ,
                n.footer = function(t) {
                    return arguments.length ? (e = t,
                        n) : void 0 !== e ? e : []
                }
                ,
                n
        }
        ,
        t.navTabs = function() {
            var t, e, n, r;
            function a(e) {
                (t = e).selectAll(".viz-navTabs").remove(),
                    t.append("ul").attr("class", "nav nav-tabs viz-navTabs").attr("role", "tablist").selectAll(".nav-item").data(a.data()).enter().append("li").attr("class", "nav-item").append("a").attr("class", "nav-link").classed("active", function(t, e) {
                        return 0 == e
                    }).attr("data-toggle", "tab").attr("href", a.id()).attr("role", "tab").text(a.text())
            }
            return a.data = function(t) {
                return arguments.length ? (e = t,
                    a) : e
            }
                ,
                a.id = function(t) {
                    return arguments.length ? (n = t,
                        a) : n || (n = function(t) {
                            return t.id
                        }
                    )
                }
                ,
                a.text = function(t) {
                    return arguments.length ? (r = t,
                        a) : r || (r = function(t) {
                            return t.text
                        }
                    )
                }
                ,
                a.set = function(e) {
                    return t.selectAll(".nav-item").each(function(t) {
                        d3.select(this).select(".nav-link").classed("active", a.text()(t) == e)
                    }),
                        a
                }
                ,
                a.get = function() {
                    var e;
                    return t.selectAll(".nav-item").filter(function(t) {
                        return d3.select(this).select(".nav-link").classed("active")
                    }).each(function(t) {
                        e = t
                    }),
                        void 0 != e ? a.text()(e) : void 0
                }
                ,
                a.update = function(n) {
                    return e = n,
                        t.selectAll(".viz-navTabs").remove(),
                        t.append("ul").attr("class", "nav nav-tabs viz-navTabs").attr("role", "tablist").selectAll(".nav-item").data(a.data()).enter().append("li").attr("class", "nav-item").append("a").attr("class", "nav-link").attr("data-toggle", "tab").attr("href", a.id()).attr("role", "tab").text(a.text()),
                        a
                }
                ,
                a
        }
        ,
        t.leaflet = {
            tiles: {
                OpenStreetMap: {
                    WorldStreet: "http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}",
                    satellite: "http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",
                    attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
                },
                OpenTopoMap: {
                    url: "http://{s}.tile.opentopomap.org/{z}/{x}/{y}.png",
                    attribution: 'Map data: &copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>, <a href="http://viewfinderpanoramas.org">SRTM</a> | Map style: &copy; <a href="https://opentopomap.org">OpenTopoMap</a> (<a href="https://creativecommons.org/licenses/by-sa/3.0/">CC-BY-SA</a>)'
                },
                Thunderforest: {
                    Cycle: "http://{s}.tile.thunderforest.com/cycle/{z}/{x}/{y}.png",
                    Transport: "http://{s}.tile.thunderforest.com/transport/{z}/{x}/{y}.png",
                    TransportDark: "http://{s}.tile.thunderforest.com/transport-dark/{z}/{x}/{y}.png",
                    TransportLandscape: "http://{s}.tile.thunderforest.com/landscape/{z}/{x}/{y}.png",
                    TransportOutdoors: "http://{s}.tile.thunderforest.com/outdoors/{z}/{x}/{y}.png",
                    TransportPioneer: "http://{s}.tile.thunderforest.com/pioneer/{z}/{x}/{y}.png",
                    attribution: '&copy; <a href="http://www.thunderforest.com/">Thunderforest</a>, &copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
                },
                OpenMapSurfer: {
                    Roads: "http://korona.geog.uni-heidelberg.de/tiles/roads/x={x}&y={y}&z={z}",
                    Grayscale: "http://korona.geog.uni-heidelberg.de/tiles/roadsg/x={x}&y={y}&z={z}",
                    attribution: 'Imagery from <a href="http://giscience.uni-hd.de/">GIScience Research Group @ University of Heidelberg</a> &mdash; Map data &copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
                },
                Hydda: {
                    Full: "http://{s}.tile.openstreetmap.se/hydda/full/{z}/{x}/{y}.png",
                    Base: "http://{s}.tile.openstreetmap.se/hydda/base/{z}/{x}/{y}.png",
                    attribution: 'Tiles courtesy of <a href="http://openstreetmap.se/" target="_blank">OpenStreetMap Sweden</a> &mdash; Map data &copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
                },
                Stamen: {
                    Toner: "http://stamen-tiles-{s}.a.ssl.fastly.net/toner/{z}/{x}/{y}.{ext}",
                    TonerBackground: "http://stamen-tiles-{s}.a.ssl.fastly.net/toner-background/{z}/{x}/{y}.{ext}",
                    TonerLite: "http://stamen-tiles-{s}.a.ssl.fastly.net/toner-lite/{z}/{x}/{y}.{ext}",
                    Watercolor: "http://stamen-tiles-{s}.a.ssl.fastly.net/watercolor/{z}/{x}/{y}.{ext}",
                    Terrain: "http://stamen-tiles-{s}.a.ssl.fastly.net/terrain/{z}/{x}/{y}.{ext}",
                    TerrainBackground: "http://stamen-tiles-{s}.a.ssl.fastly.net/terrain-background/{z}/{x}/{y}.{ext}",
                    attribution: 'Map tiles by <a href="http://stamen.com">Stamen Design</a>, <a href="http://creativecommons.org/licenses/by/3.0">CC BY 3.0</a> &mdash; Map data &copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
                },
                Esri: {
                    WorldStreetMap: "http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}",
                    WorldImagery: "http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",
                    WorldTerrain: "http://server.arcgisonline.com/ArcGIS/rest/services/World_Terrain_Base/MapServer/tile/{z}/{y}/{x}",
                    WorldShadedRelief: "http://server.arcgisonline.com/ArcGIS/rest/services/World_Shaded_Relief/MapServer/tile/{z}/{y}/{x}",
                    WorldPhysical: "http://server.arcgisonline.com/ArcGIS/rest/services/World_Physical_Map/MapServer/tile/{z}/{y}/{x}",
                    OceanBasemap: "http://server.arcgisonline.com/ArcGIS/rest/services/Ocean_Basemap/MapServer/tile/{z}/{y}/{x}",
                    NatGeoWorldMap: "http://server.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/{z}/{y}/{x}",
                    WorldGrayCanvas: "http://server.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer/tile/{z}/{y}/{x}",
                    attribution: "Tiles &copy; Esri &mdash; Source: Esri, National Geographic, DeLorme, NAVTEQ, USGS, Intermap, iPC, NRCAN, Esri Japan, METI, Esri China (Hong Kong), Esri (Thailand), TomTom, 2012"
                },
                Here: {
                    normalDay: "http://{s}.{base}.maps.cit.api.here.com/maptile/2.1/{type}/{mapID}/normal.day/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}",
                    hybridDay: "http://{s}.{base}.maps.cit.api.here.com/maptile/2.1/{type}/{mapID}/hybrid.day/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}",
                    attribution: 'Map &copy; 1987-2014 <a href="http://developer.here.com">HERE</a>'
                },
                CartoDB: {
                    Positron: "http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png",
                    PositronNoLabels: "http://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png",
                    PositronOnlyLabels: "http://{s}.basemaps.cartocdn.com/light_only_labels/{z}/{x}/{y}.png",
                    DarkMatter: "http://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png",
                    DarkMatterNoLabels: "http://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png",
                    DarkMatterOnlyLabels: "http://{s}.basemaps.cartocdn.com/dark_only_labels/{z}/{x}/{y}.png",
                    attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> &copy; <a href="http://cartodb.com/attributions">CartoDB</a>'
                }
            }
        },
        this.viz = t
}();

//https://github.com/exupero/saveSvgAsPng
(function() {
        var out$ = typeof exports != 'undefined' && exports || typeof define != 'undefined' && {} || this;
        var doctype = '<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [<!ENTITY nbsp "&#160;">]>';
        function isElement(obj) {
            return obj instanceof HTMLElement || obj instanceof SVGElement
        }
        function requireDomNode(el) {
            if (!isElement(el)) {
                throw new Error('an HTMLElement or SVGElement is required; got ' + el)
            }
        }
        function isExternal(url) {
            return url && url.lastIndexOf('http', 0) == 0 && url.lastIndexOf(window.location.host) == -1
        }
        function inlineImages(el, callback) {
            requireDomNode(el);
            var images = el.querySelectorAll('image')
                , left = images.length
                , checkDone = function() {
                if (left === 0) {
                    callback()
                }
            };
            checkDone();
            for (var i = 0; i < images.length; i += 1) {
                (function(image) {
                        var href = image.getAttributeNS("http://www.w3.org/1999/xlink", "href");
                        if (href) {
                            if (isExternal(href.value)) {
                                console.warn("Cannot render embedded images linking to external hosts: " + href.value);
                                return
                            }
                        }
                        var canvas = document.createElement('canvas');
                        var ctx = canvas.getContext('2d');
                        var img = new Image();
                        img.crossOrigin = "anonymous";
                        href = href || image.getAttribute('href');
                        if (href) {
                            img.src = href;
                            img.onload = function() {
                                canvas.width = img.width;
                                canvas.height = img.height;
                                ctx.drawImage(img, 0, 0);
                                image.setAttributeNS("http://www.w3.org/1999/xlink", "href", canvas.toDataURL('image/png'));
                                left -= 1;
                                checkDone()
                            }
                            ;
                            img.onerror = function() {
                                console.log("Could not load " + href);
                                left -= 1;
                                checkDone()
                            }
                        } else {
                            left -= 1;
                            checkDone()
                        }
                    }
                )(images[i])
            }
        }
        function styles(el, options, cssLoadedCallback) {
            var selectorRemap = options.selectorRemap;
            var modifyStyle = options.modifyStyle;
            var css = "";
            var fontsQueue = [];
            var sheets = document.styleSheets;
            for (var i = 0; i < sheets.length; i += 1) {
                try {
                    var rules = sheets[i].cssRules
                } catch (e) {
                    console.warn("Stylesheet could not be loaded: " + sheets[i].href);
                    continue
                }
                if (rules != null) {
                    for (var j = 0, match; j < rules.length; j += 1,
                        match = null) {
                        var rule = rules[j];
                        if (typeof (rule.style) != "undefined") {
                            var selectorText;
                            try {
                                selectorText = rule.selectorText
                            } catch (err) {
                                console.warn('The following CSS rule has an invalid selector: "' + rule + '"', err)
                            }
                            try {
                                if (selectorText) {
                                    match = el.querySelector(selectorText) || el.parentNode.querySelector(selectorText)
                                }
                            } catch (err) {
                                console.warn('Invalid CSS selector "' + selectorText + '"', err)
                            }
                            if (match) {
                                var selector = selectorRemap ? selectorRemap(rule.selectorText) : rule.selectorText;
                                var cssText = modifyStyle ? modifyStyle(rule.style.cssText) : rule.style.cssText;
                                css += selector + " { " + cssText + " }\n"
                            } else if (rule.cssText.match(/^@font-face/)) {
                                var fontUrlRegexp = /url\(["']?(.+?)["']?\)/;
                                var fontUrlMatch = rule.cssText.match(fontUrlRegexp);
                                var externalFontUrl = (fontUrlMatch && fontUrlMatch[1]) || '';
                                var fontUrlIsDataURI = externalFontUrl.match(/^data:/);
                                if (fontUrlIsDataURI) {
                                    externalFontUrl = ''
                                }
                                if (externalFontUrl === 'about:blank') {
                                    externalFontUrl = ''
                                }
                                if (externalFontUrl) {
                                    if (externalFontUrl.startsWith('../')) {
                                        externalFontUrl = sheets[i].href + '/../' + externalFontUrl
                                    } else if (externalFontUrl.startsWith('./')) {
                                        externalFontUrl = sheets[i].href + '/.' + externalFontUrl
                                    }
                                    fontsQueue.push({
                                        text: rule.cssText,
                                        fontUrlRegexp: fontUrlRegexp,
                                        format: getFontMimeTypeFromUrl(externalFontUrl),
                                        url: externalFontUrl
                                    })
                                } else {
                                    css += rule.cssText + '\n'
                                }
                            }
                        }
                    }
                }
            }
            processFontQueue(fontsQueue);
            function getFontMimeTypeFromUrl(fontUrl) {
                var supportedFormats = {
                    'woff2': 'font/woff2',
                    'woff': 'font/woff',
                    'otf': 'application/x-font-opentype',
                    'ttf': 'application/x-font-ttf',
                    'eot': 'application/vnd.ms-fontobject',
                    'sfnt': 'application/font-sfnt',
                    'svg': 'image/svg+xml'
                };
                var extensions = Object.keys(supportedFormats);
                for (var i = 0; i < extensions.length; i += 1) {
                    var extension = extensions[i];
                    if (fontUrl.indexOf('.' + extension) > 0) {
                        return supportedFormats[extension]
                    }
                }
                console.error('Unknown font format for ' + fontUrl + '; Fonts may not be working correctly');
                return 'application/octet-stream'
            }
            function processFontQueue(queue) {
                if (queue.length > 0) {
                    var font = queue.pop();
                    processNext(font)
                } else {
                    cssLoadedCallback(css)
                }
                function processNext(font) {
                    var oReq = new XMLHttpRequest();
                    oReq.addEventListener('load', fontLoaded);
                    oReq.addEventListener('error', transferFailed);
                    oReq.addEventListener('abort', transferFailed);
                    oReq.open('GET', font.url);
                    oReq.responseType = 'arraybuffer';
                    oReq.send();
                    function fontLoaded() {
                        var fontBits = oReq.response;
                        var fontInBase64 = arrayBufferToBase64(fontBits);
                        updateFontStyle(font, fontInBase64)
                    }
                    function transferFailed(e) {
                        console.warn('Failed to load font from: ' + font.url);
                        console.warn(e);
                        css += font.text + '\n';
                        processFontQueue(queue)
                    }
                    function updateFontStyle(font, fontInBase64) {
                        var dataUrl = 'url("data:' + font.format + ';base64,' + fontInBase64 + '")';
                        css += font.text.replace(font.fontUrlRegexp, dataUrl) + '\n';
                        setTimeout(function() {
                            processFontQueue(queue)
                        }, 0)
                    }
                }
            }
            function arrayBufferToBase64(buffer) {
                var binary = '';
                var bytes = new Uint8Array(buffer);
                var len = bytes.byteLength;
                for (var i = 0; i < len; i += 1) {
                    binary += String.fromCharCode(bytes[i])
                }
                return window.btoa(binary)
            }
        }
        function getDimension(el, clone, dim) {
            var v = (el.viewBox && el.viewBox.baseVal && el.viewBox.baseVal[dim]) || (clone.getAttribute(dim) !== null && !clone.getAttribute(dim).match(/%$/) && parseInt(clone.getAttribute(dim))) || el.getBoundingClientRect()[dim] || parseInt(clone.style[dim]) || parseInt(window.getComputedStyle(el).getPropertyValue(dim));
            return (typeof v === 'undefined' || v === null || isNaN(parseFloat(v))) ? 0 : v
        }
        function reEncode(data) {
            data = encodeURIComponent(data);
            data = data.replace(/%([0-9A-F]{2})/g, function(match, p1) {
                var c = String.fromCharCode('0x' + p1);
                return c === '%' ? '%25' : c
            });
            return decodeURIComponent(data)
        }
        out$.prepareSvg = function(el, options, cb) {
            requireDomNode(el);
            options = options || {};
            options.scale = options.scale || 1;
            options.responsive = options.responsive || false;
            var xmlns = "http://www.w3.org/2000/xmlns/";
            inlineImages(el, function() {
                var outer = document.createElement("div");
                var clone = el.cloneNode(true);
                var width, height;
                if (el.tagName == 'svg') {
                    width = options.width || getDimension(el, clone, 'width');
                    height = options.height || getDimension(el, clone, 'height')
                } else if (el.getBBox) {
                    var box = el.getBBox();
                    width = box.x + box.width;
                    height = box.y + box.height;
                    clone.setAttribute('transform', clone.getAttribute('transform').replace(/translate\(.*?\)/, ''));
                    var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
                    svg.appendChild(clone);
                    clone = svg
                } else {
                    console.error('Attempted to render non-SVG element', el);
                    return
                }
                clone.setAttribute("version", "1.1");
                if (!clone.getAttribute('xmlns')) {
                    clone.setAttributeNS(xmlns, "xmlns", "http://www.w3.org/2000/svg")
                }
                if (!clone.getAttribute('xmlns:xlink')) {
                    clone.setAttributeNS(xmlns, "xmlns:xlink", "http://www.w3.org/1999/xlink")
                }
                if (options.responsive) {
                    clone.removeAttribute('width');
                    clone.removeAttribute('height');
                    clone.setAttribute('preserveAspectRatio', 'xMinYMin meet')
                } else {
                    clone.setAttribute("width", width * options.scale);
                    clone.setAttribute("height", height * options.scale)
                }
                clone.setAttribute("viewBox", [options.left || 0, options.top || 0, width, height].join(" "));
                var fos = clone.querySelectorAll('foreignObject > *');
                for (var i = 0; i < fos.length; i += 1) {
                    if (!fos[i].getAttribute('xmlns')) {
                        fos[i].setAttributeNS(xmlns, "xmlns", "http://www.w3.org/1999/xhtml")
                    }
                }
                outer.appendChild(clone);
                styles(el, options, cssLoadedCallback);
                function cssLoadedCallback(css) {
                    var s = document.createElement('style');
                    s.setAttribute('type', 'text/css');
                    s.innerHTML = "<![CDATA[\n" + css + "\n]]>";
                    var defs = document.createElement('defs');
                    defs.appendChild(s);
                    clone.insertBefore(defs, clone.firstChild);
                    if (cb) {
                        var outHtml = outer.innerHTML;
                        outHtml = outHtml.replace(/NS\d+:href/gi, 'xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href');
                        cb(outHtml, width, height)
                    }
                }
            })
        }
        ;
        out$.svgAsDataUri = function(el, options, cb) {
            out$.prepareSvg(el, options, function(svg) {
                var uri = 'data:image/svg+xml;base64,' + window.btoa(reEncode(doctype + svg));
                if (cb) {
                    cb(uri)
                }
            })
        }
        ;
        out$.svgAsPngUri = function(el, options, cb) {
            requireDomNode(el);
            options = options || {};
            options.encoderType = options.encoderType || 'image/png';
            options.encoderOptions = options.encoderOptions || 0.8;
            var convertToPng = function(src, w, h) {
                var canvas = document.createElement('canvas');
                var context = canvas.getContext('2d');
                canvas.width = w;
                canvas.height = h;
                if (options.canvg) {
                    options.canvg(canvas, src)
                } else {
                    context.drawImage(src, 0, 0)
                }
                if (options.backgroundColor) {
                    context.globalCompositeOperation = 'destination-over';
                    context.fillStyle = options.backgroundColor;
                    context.fillRect(0, 0, canvas.width, canvas.height)
                }
                var png;
                try {
                    png = canvas.toDataURL(options.encoderType, options.encoderOptions)
                } catch (e) {
                    if ((typeof SecurityError !== 'undefined' && e instanceof SecurityError) || e.name == "SecurityError") {
                        console.error("Rendered SVG images cannot be downloaded in this browser.");
                        return
                    } else {
                        throw e
                    }
                }
                cb(png)
            };
            if (options.canvg) {
                out$.prepareSvg(el, options, convertToPng)
            } else {
                out$.svgAsDataUri(el, options, function(uri) {
                    var image = new Image();
                    image.onload = function() {
                        convertToPng(image, image.width, image.height)
                    }
                    ;
                    image.onerror = function() {
                        console.error('There was an error loading the data URI as an image on the following SVG\n', window.atob(uri.slice(26)), '\n', "Open the following link to see browser's diagnosis\n", uri)
                    }
                    ;
                    image.src = uri
                })
            }
        }
        ;
        out$.download = function(name, uri) {
            if (navigator.msSaveOrOpenBlob) {
                navigator.msSaveOrOpenBlob(uriToBlob(uri), name)
            } else {
                var saveLink = document.createElement('a');
                var downloadSupported = 'download'in saveLink;
                if (downloadSupported) {
                    saveLink.download = name;
                    saveLink.style.display = 'none';
                    document.body.appendChild(saveLink);
                    try {
                        var blob = uriToBlob(uri);
                        var url = URL.createObjectURL(blob);
                        saveLink.href = url;
                        saveLink.onclick = function() {
                            requestAnimationFrame(function() {
                                URL.revokeObjectURL(url)
                            })
                        }
                    } catch (e) {
                        console.warn('This browser does not support object URLs. Falling back to string URL.');
                        saveLink.href = uri
                    }
                    saveLink.click();
                    document.body.removeChild(saveLink)
                } else {
                    window.open(uri, '_temp', 'menubar=no,toolbar=no,status=no')
                }
            }
        }
        ;
        function uriToBlob(uri) {
            var byteString = window.atob(uri.split(',')[1]);
            var mimeString = uri.split(',')[0].split(':')[1].split(';')[0];
            var buffer = new ArrayBuffer(byteString.length);
            var intArray = new Uint8Array(buffer);
            for (var i = 0; i < byteString.length; i += 1) {
                intArray[i] = byteString.charCodeAt(i)
            }
            return new Blob([buffer],{
                type: mimeString
            })
        }
        out$.saveSvg = function(el, name, options) {
            requireDomNode(el);
            options = options || {};
            out$.svgAsDataUri(el, options, function(uri) {
                out$.download(name, uri)
            })
        }
        ;
        out$.saveSvgAsPng = function(el, name, options) {
            requireDomNode(el);
            options = options || {};
            out$.svgAsPngUri(el, options, function(uri) {
                out$.download(name, uri)
            })
        }
        ;
        if (typeof define !== 'undefined') {
            define(function() {
                return out$
            })
        }
    }
)();

//Copyright 2010 by Robin W. Spencer
"use strict";
var netClustering = {
    version: "0.1"
};
(function() {
        function binaryTreeWalk(currentNode, tree, depth, doLeafAction, doDownAction, doUpAction) {
            if (tree[currentNode].leftChild > -1) {
                depth += 1;
                if (doDownAction) {
                    doDownAction(currentNode, tree, depth)
                }
                binaryTreeWalk(tree[currentNode].leftChild, tree, depth, doLeafAction, doDownAction, doUpAction)
            }
            if (tree[currentNode].rightChild == -1) {
                if (doLeafAction) {
                    doLeafAction(currentNode, tree, depth)
                }
            }
            if (tree[currentNode].rightChild > -1) {
                binaryTreeWalk(tree[currentNode].rightChild, tree, depth, doLeafAction, doDownAction, doUpAction);
                if (doUpAction) {
                    doUpAction(currentNode, tree, depth)
                }
                depth -= 1
            }
        }
        function addClosestPairByCommunity(tree, deltaQ, a) {
            var n = tree.length;
            var H = {};
            for (var hash in deltaQ) {
                var dQ = deltaQ[hash];
                var keys = hash.split("~");
                var i = Number(keys[0]);
                var j = Number(keys[1]);
                if (!H[i]) {
                    H[i] = []
                }
                if (!H[j]) {
                    H[j] = []
                }
                H[i].push({
                    "dQ": dQ,
                    "i": i,
                    "j": j
                });
                H[j].push({
                    "dQ": dQ,
                    "i": i,
                    "j": j
                })
            }
            var Hmax = {
                "dQ": -Infinity,
                "i": -1,
                "j": -1
            };
            for (var i = 0; i < n; i += 1) {
                if (H[i]) {
                    H[i].sort(function(a, b) {
                        return b.dQ - a.dQ
                    });
                    if (H[i][0].dQ > Hmax.dQ) {
                        Hmax.dQ = H[i][0].dQ;
                        Hmax.i = H[i][0].i;
                        Hmax.j = H[i][0].j
                    }
                }
            }
            if (Hmax.i == -1) {
                return null
            }
            var wt = tree[Hmax.i].weight + tree[Hmax.j].weight;
            tree.push({
                "parent": -1,
                "leftChild": Hmax.i,
                "rightChild": Hmax.j,
                "weight": wt,
                "dQ": Hmax.dQ
            });
            tree[Hmax.i].parent = n;
            tree[Hmax.j].parent = n;
            var hashToZap = [];
            for (var k = 0; k < n; k += 1) {
                if (k != Hmax.i && k != Hmax.j && H[k]) {
                    var hashik = Math.min(Hmax.i, k) + "~" + Math.max(Hmax.i, k);
                    var hashjk = Math.min(Hmax.j, k) + "~" + Math.max(Hmax.j, k);
                    var hashNew = k + "~" + n;
                    var t1 = deltaQ[hashik];
                    var t2 = deltaQ[hashjk];
                    if (!isNaN(t1)) {
                        hashToZap.push(hashik);
                        if (!isNaN(t2)) {
                            hashToZap.push(hashjk);
                            deltaQ[hashNew] = t1 + t2
                        } else {
                            deltaQ[hashNew] = t1 - 2.0 * a[Hmax.j] * a[k]
                        }
                    } else {
                        if (!isNaN(t2)) {
                            hashToZap.push(hashjk);
                            deltaQ[hashNew] = t2 - 2.0 * a[Hmax.i] * a[k]
                        } else {
                            deltaQ[hashNew] = null;
                        }
                    }
                }
            }
            a[n] = a[Hmax.i] + a[Hmax.j];
            deltaQ[Hmax.i + "~" + Hmax.j] = null;
            for (var i = 0; i < hashToZap.length; i += 1) {
                deltaQ[hashToZap[i]] = null
            }
            var dQcopy = {};
            var ndq = 0;
            for (var hash in deltaQ) {
                if (deltaQ[hash]) {
                    dQcopy[hash] = deltaQ[hash];
                    ndq += 1
                }
            }
            return {
                "value": Hmax.dQ,
                "array": dQcopy
            }
        }
        function buildTreeByCommunities(dataObj, showNotes) {
            var n = dataObj.names.length;
            var k = [];
            for (var i = 0; i < n; i += 1) {
                k[i] = 0
            }
            var m = 0;
            var W = 0;
            if (dataObj.useWeights) {
                for (var hash in dataObj.distances) {
                    var keys = hash.split("~");
                    var i = Number(keys[0]);
                    var j = Number(keys[1]);
                    var d = dataObj.distances[hash];
                    k[i] += d;
                    k[j] += d;
                    W += d;
                    m += 1
                }
                if (!W) {
                    W = 1e-7
                }
                ;var inv2m = 1 / (2 * W)
            } else {
                for (var hash in dataObj.distances) {
                    var keys = hash.split("~");
                    var i = Number(keys[0]);
                    var j = Number(keys[1]);
                    k[i] += 1;
                    k[j] += 1;
                    m += 1
                }
                if (!m) {
                    m = 1e-7
                }
                ;var inv2m = 1 / (2 * m)
            }
            var deltaQ = {};
            for (var hash in dataObj.distances) {
                var keys = hash.split("~");
                var i = Number(keys[0]);
                var j = Number(keys[1]);
                if (dataObj.useWeights) {
                    deltaQ[hash] = 2.0 * inv2m * dataObj.distances[hash] - 2.0 * inv2m * inv2m * k[i] * k[j]
                } else {
                    deltaQ[hash] = 2.0 * (inv2m - k[i] * k[j] * inv2m * inv2m);
                }
            }
            var a = [];
            for (var i = 0; i < n; i += 1) {
                a[i] = inv2m * k[i]
            }
            var tree = [];
            for (var i = 0; i < n; i += 1) {
                tree.push({
                    "parent": -1,
                    "leftChild": -1,
                    "rightChild": -1,
                    "weight": 1,
                    "linkage": a[i],
                    "name": dataObj.names[i],
                    "primaryKey": i
                })
            }
            var Q = 0.0;
            var maxQ = -Infinity;
            var dQobj = {
                "value": 0,
                "array": deltaQ
            };
            var numCommunities = 1;
            while (dQobj && tree.length < (2 * n - 1)) {
                dQobj = addClosestPairByCommunity(tree, dQobj.array, a);
                if (dQobj) {
                    Q += dQobj.value;
                    if (dQobj.value < 0) {
                        numCommunities += 1
                    }
                    ;maxQ = Math.max(maxQ, Q)
                } else {
                    return null
                }
            }
            var index = 0;
            var root = tree.length - 1;
            binaryTreeWalk(root, tree, 0, function(currentNode, tree, depth) {
                tree[currentNode].index = index;
                index += 1
            }, null, null);
            if (showNotes) {
                var notes = n + " nodes, " + m + " of " + (n * (n - 1) / 2) + " possible edges (" + Math.round(200 * m / (n * (n - 1))) + "%) ";
                notes += "with data, and " + numCommunities + " primary communities identified.";
                notes += "&nbsp; &nbsp; Q=" + maxQ.toFixed(3);
                document.getElementById("notes").innerHTML = notes
            }
            return {
                "tree": tree,
                "distances": dataObj.distances,
                "root": root,
                "names": dataObj.names,
                "useWeights": dataObj.useWeights
            }
        }
        function findSplits(treeObj) {
            var breakNext = true;
            var breakNodes = [];
            var g = -1;
            var group = [];
            var members = "";
            var tracker = 0;
            binaryTreeWalk(treeObj.root, treeObj.tree, 0, function(node, tree, depth) {
                if (breakNext) {
                    g += 1;
                    breakNodes.push(node);
                    breakNext = false
                }
                group[node] = g;
                members += treeObj.tree[node].name + ","
            }, function(node, tree, depth) {
                var thisNode = tree[node];
                if (thisNode.dQ < 0) {
                    breakNext = true;
                    tracker = 0
                }
                tracker += 1
            }, function(node, tree, depth) {
                var thisNode = tree[node];
                tracker -= 1;
                if (tracker == 1) {
                    breakNext = true;
                    members += "~"
                }
            });
            var numGroups = g + 1;
            members = members.slice(0, -2);
            members = members.replace(/,~/g, "~");
            return {
                "numGroups": numGroups,
                "group": group,
                "members": members,
                "breakNodes": breakNodes
            }
        }
        function findSubCommunities(treeObj, depth, prevGroup) {
            if (!treeObj) {
                return
            }
            var tree = treeObj.tree;
            var root = treeObj.root;
            var names = treeObj.names;
            var splitInfo = findSplits(treeObj);
            var numGroups = splitInfo.numGroups;
            var group = splitInfo.group;
            var t = splitInfo.members.split("~");
            var groups = [];
            for (var g = 0; g < t.length; g += 1) {
                groups.push((t[g]).split(","))
            }
            var dataObjList = [];
            for (var g = 0; g < numGroups; g += 1) {
                dataObjList.push({
                    "names": [],
                    "distances": [],
                    "useWeights": treeObj.useWeights
                })
            }
            var nameKeys = [];
            for (var i = 0; i < names.length; i += 1) {
                var name = names[i];
                dataObjList[group[i]].names.push(name);
                nameKeys[i] = dataObjList[group[i]].names.length - 1
            }
            for (var hash in treeObj.distances) {
                var keys = hash.split("~");
                var i = Number(keys[0]);
                var j = Number(keys[1]);
                if (group[i] == group[j]) {
                    var newHash = nameKeys[i] + "~" + nameKeys[j];
                    dataObjList[group[i]].distances[newHash] = treeObj.distances[hash]
                }
            }
            if (numGroups > 1) {
                for (var g = 0; g < numGroups; g += 1) {
                    var innerTreeObj = buildTreeByCommunities(dataObjList[g]);
                    if (innerTreeObj && innerTreeObj.tree) {
                        var innerGroups = findSplits(innerTreeObj).numGroups;
                        if (innerGroups > 1) {
                            var subgroups = findSubCommunities(innerTreeObj, depth + 1, g);
                            groups[g] = subgroups
                        }
                    }
                }
            }
            return groups
        }
        netClustering.buildTreeByCommunities = buildTreeByCommunities;
        netClustering.findSubCommunities = findSubCommunities;
        netClustering.cluster = function(nodes, edges, clusterAttr, edgesCountAttr) {
            var dataObj = {}, treeObj, groups = [], i;
            if (clusterAttr === undefined) {
                clusterAttr = "cluster"
            }
            if (edgesCountAttr === undefined) {
                edgesCountAttr = "value"
            }
            var linksForClustering = [];
            if (edges.length > 0 && typeof (edges[0].source) === "object") {
                linksForClustering = edges.map(function(d) {
                    var sourceId = nodes.indexOf(d.source)
                        , targetId = nodes.indexOf(d.target);
                    if (sourceId === -1 || targetId === -1) {
                        return null
                    } else {
                        return {
                            source: sourceId,
                            target: targetId,
                            count: d[edgesCountAttr] !== undefined ? d[edgesCountAttr] : 1
                        }
                    }
                })
            } else {
                edges.forEach(function(d) {
                    linksForClustering.push({
                        source: d.source,
                        target: d.target,
                        count: d[edgesCountAttr] !== undefined ? d[edgesCountAttr] : 1
                    })
                })
            }
            dataObj.method = "newman";
            dataObj.useWeights = true;
            dataObj.names = nodes.map(function(d, i) {
                return "" + i
            });
            dataObj.distances = {};
            linksForClustering = linksForClustering.filter(function(d) {
                return d.source !== d.target
            });
            linksForClustering.forEach(function(d) {
                var hash = Math.min(d.source, d.target) + "~" + Math.max(d.source, d.target);
                dataObj.distances[hash] = +d.count
            });
            dataObj = addDummyMetaNode(dataObj);
            treeObj = buildTreeByCommunities(dataObj, false);
            groups = findSubCommunities(treeObj, 0, 0);
            groups = removeDummyMetaNode(groups);
            i = 0;
            groups.forEach(function(d, i) {
                function assignToCluster(ele, i) {
                    if (ele instanceof Array) {
                        ele.forEach(function(e) {
                            assignToCluster(e, i)
                        })
                    } else {
                        nodes[+ele][clusterAttr] = i.toString()
                    }
                }
                assignToCluster(d, i)
            });
            return groups
        }
        ;
        function addDummyMetaNode(dataObj) {
            dataObj.names.push("DUMMY");
            dataObj.names.forEach(function(d, i) {
                if (i === dataObj.names.length - 1) {
                    return
                }
                var hash = i + "~" + (dataObj.names.length - 1);
                dataObj.distances[hash] = 0.1
            });
            return dataObj
        }
        function removeDummyMetaNode(groups) {
            var i, ele;
            for (i = 0; i < groups.length; i += 1) {
                ele = groups[i];
                if (ele instanceof Array) {
                    ele = removeDummyMetaNode(ele);
                    if (ele.length === 0) {
                        groups.splice(i, 1)
                    }
                } else {
                    if (ele === "DUMMY" || ele === "DUMM") {
                        groups.splice(i, 1);
                        break
                    }
                }
            }
            return groups
        }
    }
)();

"use strict";

//DataGalaxy全局对象
var DG = {
    //constants
    version: "0.1",
    CD_TOPLEFT: 0,
    CD_TOPRIGHT: 1,
    CD_BOTTOMLEFT: 2,
    CD_BOTTOMRIGHT: 3,

    NODE_GEOMETRY: 0,
    NODE_IMAGE: 1,
    NODE_TEXT: 2,

    NODE_SHAPE_CIRCLER: 0,
    NODE_SHAPE_RECT: 1,
    NODE_SHAPE_STAR: 2,

    LINK_SHAPE_STRIP: 0,
    LINK_SHAPE_ARC: 1,
    LINK_SHAPE_STRIP_ARROW: 2,
    LINK_SHAPE_ARC_ARROW: 3,

    LINE_SOLID: 0,
    LINE_DASHED: 1,
    LINE_DOTTED: 2,
    LINE_DASH_DOTTED: 3,

    VS_NORMAL: 0,
    VS_NORMAL_LABELED: 1,
    VS_HIGHLIGHT: 2,
    VS_HIGHLIGHT_LABELED: 3,
    VS_BLUR: 4,
    VS_BLUR_LABELED: 5,
    VS_NONE: 6,

    STAT_DEGREE_CENTRALITY: 0,
    STAT_PAGE_RANK: 1,
    STAT_DEGREE: 2,
    STAT_IN_DEGREE: 3,
    STAT_OUT_DEGREE: 4,
    STAT_SUMMARY: 5,
    STAT_CLUSTER: 6,

    CLUSTERING_GN: 0,

    VM_LINEAR: 0,
    VM_CATEGORY: 1,
    VM_RANGE: 2,

    VM_DIM_NODE_DATA: 0,
    VM_DIM_LINK_DATA: 1,
    VM_DIM_STATISTIC: 2,
    VM_DIM_CLUSTER: 3,

    FILTER_ENUM: 0,
    FILTER_RANGE: 1,

    FILTER_NODE_DATA: 0,
    FILTER_LINK_DATA: 1,
    FILTER_STATISTIC: 2,

    LAYOUT_ATLAS2: 0,
    LAYOUT_FR: 1,
    LAYOUT_CIRCLE: 2,
    LAYOUT_RANDOM: 3,
    LAYOUT_GEOCOORD: 4,
    LAYOUT_ADDRESS: 5,
    LAYOUT_TREE: 6
};

(function() {

        //对象字面量的类型名及默认值

        //坐标
        var Position = {
            x: "0",
            y: "0",
            direction: DG.CD_TOPLEFT
        }

        //大小
        var Size = {
            width: "12px",
            height: "12px"
        }

        //PageRankOptions (PageRank统计参数)
        var PageRankOptions = {
            directed: true,
            Probability: 12,
            epsilon: 12,
            UseEdgeWeight: true,
            edgeWeightProp: "1"
        }

        //VisualMapDimension (视觉映射维度)
        var VisualMapDimension = {
            type: 'DG.VM_DIM_NODE_DATA',
            dataKey: '',
            statType: '',
            statParams: function() {
            },
            values: [],
            clusters: function() {
            }
        }

        //VisualMapTarget (映射目标视觉项)
        var VisualMapTarget = {
            nodeColors: ['red', 'yellow', 'green'],
            nodeShapes: [DG.NODE_SHAPE_CIRCLER, DG.NODE_SHAPE_RECT, DG.NODE_SHAPE_STAR],
            nodeSizes: ['12px'],
            nodeLabelColors: ['red', 'green', 'blue'],
            nodeLabelFontSizes: [12, 14, 16],
            nodeVisualStatuss: [DG.VS_NORMAL, DG.VS_NORMAL_LABELED, DG.VS_HIGHLIGHT, DG.VS_HIGHLIGHT_LABELED, DG.VS_BLUR, DG.VS_BLUR_LABELED, DG.VS_NONE],
            linkColors: ['red', 'blue', 'green'],
            linkWidths: [12, 14, 16],
            linkVisualStatus: [DG.VS_NORMAL, DG.VS_NORMAL_LABELED, DG.VS_HIGHLIGHT, DG.VS_HIGHLIGHT_LABELED, DG.VS_BLUR, DG.VS_BLUR_LABELED, DG.VS_NONE]
        }

        //VisualMap (视觉映射)
        var VisualMap = {
            id: '1',
            type: 'DG.VM_DIM_NODE_DAT',
            dimension: 'DG.CD_TOPLEFT',
            target: 'nodeColor'
        }

        //FilterDimension (过滤维度)
        var FilterDimension = {
            type: DG.FILTER_ENUM,
            dataKey: null,
            statType: null,
            statParams: function() {//
            },
            values: [1, 2, 3, 4]
        }

        //Filter (过滤器)
        //add by river 20181024
        var Filter = {
            id: "filter1",
            type: DG.FILTER_ENUM,
            dimension: {
                type: DG.FILTER_DIM_NODE_DATA,
                dataKey: "name",
                values: ["Tom", "Bob", "Jerry"]
            }
        }

        //ForceAtlas2Options (Force Atlas 2布局参数)
        var ForceAtlas2Options = {
            tolerance: 12,
            approximateRepulsion: true,
            approximation: 12,
            scaling: 12,
            strongerGravity: true,
            gravity: 12,
            dissuadeHubs: true,
            linLongMode: true,
            preventoverlap: true,
            edgeWeightInfluence: 1
        }

        //FRLayoutOptions ( Fruchterman Reingold布局参数)
        var FRLayoutOptions = {
            area: 1,
            gravity: 12,
            speed: 12
        }

        //CircleLayoutOptions (环形布局参数)
        var CircleLayoutOptions = {
            fixedDiameter: true,
            diameterSize: 12,
            orderNodesBy: 'id',
            clockWise: true,
            preventNodeOverlap: true,
            labelKey: ""
        }

        //RandomLayoutOptions (随机布局参数)
        var RandomLayoutOptions = {
            spaceSize: 12
        }

        //GeoPosition (地理位置)
        var GeoPosition = {
            lng: 24,
            lat: 24,
            type: 'WSG84'
        }

        //GeoLayoutOptions (地理位置布局参数)
        var GeoLayoutOptions = {
            scale: 1.5,
            autoScale: true,
            '3DMap': true,
            lngKey: 'lng',
            latKey: 'lat',
            coordType: 'WSG84',
            center: 'lng'
        }

        //AddressLayoutOptions (地名布局参数)
        var AddressLayoutOptions = {
            scale: 1.5,
            autoScale: true,
            '3DMap': true,
            AddKey: '',
            center: 'lng'
        }

        //公用方法，给对象字面量添加类型中定义的默认属性
        function addDefault(CLASS, liter) {
            if (typeof CLASS == "object") {
                for (var key in CLASS) {
                    if (!liter.hasOwnProperty(key)) {
                        liter[key] = CLASS[key];
                    }
                }
            } else if (typeof CLASS == "function") {
            }

        }

        //类型和构造函数
        //创建点
        function Node(id, label, data) {
            switch (arguments.length) {
                case 0:
                    //默认节点
                    this.id = _guid();
                    this.label = "";
                    this.data = {};
                    break;
                case 1:
                    if (typeof arguments[0] == "object") {
                        //从传入的对象中解析数据
                        if (typeof arguments[0].id == "string" || typeof arguments[0].id == "number") {
                            //如传入的对象中包含id，提取出来
                            this.id = arguments[0].id;
                            delete arguments[0].id;
                        } else {
                            this.id = _guid();
                        }

                        if (typeof arguments[0].label == "string" || typeof arguments[0].label == "number") {
                            //如传入的对象中包含label，提取出来
                            this.label = arguments[0].label;
                            delete arguments[0].label;
                        } else {
                            this.label = "";
                        }
                        this.data = arguments[0];

                    } else {
                        //非对象的单参数视为label
                        this.id = _guid();
                        this.label = arguments[0];
                        this.data = {};
                    }
                    break;
                case 2:
                    if (typeof arguments[0] == "string" || typeof arguments[0] == "number") {
                        //两参数时，第一参数视为id,第二参数为label或自定义数据
                        this.id = arguments[0];
                    } else {
                        this.id = _guid();
                    }
                    if (typeof arguments[1] == "string" || typeof arguments[1] == "number") {
                        this.label = arguments[1];
                    } else if (typeof arguments[1] == "ojbect") {
                        if (typeof arguments[1].label == "string" || typeof arguments[1].label == "number") {
                            this.label = arguments[1].label;
                            delete arguments[1].label;
                        }
                        this.data = arguments[1];
                    }
                    break;
                case 3:
                default:
                    break;
            }

            this.id = typeof id == "undefined" ? _guid() : id;
            this.label = typeof label == "undefined" ? "" : label;
            this.data = typeof data != "object" ? {} : data;
            this.visualStatus = DG.VS_NORMAL;
            this.symbolType = DG.NODE_GEOMETRY;
            this.shape = DG.NODE_SHAPE_CIRCLER;
            this.fillColor = 'steelblue';
            this.size = {
                width: '50px',
                height: '50px'
            };
            this.style = "";
            this.labelStyle = "";
        }
        //创建路径
        function Path() {
            this.nodes = []
        }
        //创建边
        function Link(id, source, target, label, data) {
            this.id = id;
            this.source = source;
            this.target = target;
            this.data = data;
            this.visualStatus = DG.VS_NORMAL,
                this.shape = DG.LINK_SHAPE_STRIP,
                this.color = 'steelblue';
            this.width = 5;
            this.label = label;
            this.labelStyle = "";
        }

        //图类型构造函数
        function Graph(nodes, links) {
            this.id = _guid();
            //图ID
            this.nodes = nodes;
            //节点数组
            this.links = links;
            //边数组
            this.defaultContainer = 'div.container';
            //图的默认显示容器
            this.autoUpdate = true;
            //当nodes/links发生改变时，是否自动刷新显示
        }

        //工厂方法：从json数据创建图对象
        function createGraphFromJson(json) {
            var _this = this;
            json.nodes.forEach(function(d) {
                d.__proto__ = _this.Node.prototype;
                if (typeof d.id == "undefined") {
                    d.id = _guid()
                }
                if (typeof d.symbolType == "undefined") {
                    d.symbolType = DG.NODE_GEOMETRY
                }
                if (typeof d.size == "undefined") {
                    d.size = {
                        width: "10",
                        height: "10"
                    }
                }
                if (typeof d.fillColor == "undefined") {
                    d.fillColor = "steelblue"
                }
            });
            json.links.forEach(function(d) {
                d.__proto__ = _this.Link.prototype;
                if (typeof d.id == "undefined") {
                    d.id = _guid()
                }
                if (typeof d.width == "undefined") {
                    d.width = 1
                }
                if (typeof d.color == "undefined") {
                    d.color = "steelblue"
                }
            });
            var graph = new Graph(json.nodes,json.links);
            if (typeof json.id == "undefined") {
                graph.id = this.guid();
            } else {
                graph.id = json.id;
            }
            return graph;
        }

        //从WOS文件生成图
        function createGraphFromWosText(text, callback) {

            var url = "http://192.168.2.221:8082/read/readTxtTOJson2"
            var params = {
                "userId": "userId",
                "seriaNumber": "0000000",
                "page": "",
                "pageSize": "",
                "graph": {
                    id: _guid()
                },
                "data": {
                    wosText: text
                }
            }

            _fetchFromBackend(params, url, function(res) {
                var graph = DG.createGraphFromJson({
                    nodes: res.data.nodes,
                    links: res.data.links
                })
                callback.call(this, graph);
            }, false);

        }

        //设计显示/隐藏类型方法	visualStatus:显示状态
        function nodeSetVisualStatus(vStatus) {
            this.visualStatus = vStatus;
            var gNodes = _findGNodesById(this.id);
            gNodes.call(_setSymbolVS);

        }
        //节点的当前位置
        //add by river 20181025
        function getPosition() {
            this.position = {
                x: this.x,
                y: this.y
            };
            return this.position;
        }
        //设置节点的显示方式	type:节点符号类型
        function nodeSetSymbolType(type) {
            this.symbolType = type;
            var gNodes = _findGNodesById(this.id);
            _drawNodeSymbol(gNodes, 1);
        }

        //add by selena 20181023
        //显示节点方法
        function nodeShow() {
            this.visualStatus = DG.VS_NORMAL;
            var gNodes = _findGNodesById(this.id);
            _drawNodeSymbol(gNodes);
        }
        //隐藏节点方法
        function nodeHide() {
            this.visualStatus = DG.VS_NONE;
            var gNodes = _findGNodesById(this.id);
            _drawNodeSymbol(gNodes);
        }

        //移动节点到某个坐标位置
        function moveNodesTo(pos) {
            if (!this.forceStopped) {
                this.force.stop();
            }
            this.__gNodes.attr("cx", function(d) {
                if (pos.hasOwnProperty(d.id)) {
                    d.fx = pos[d.id]['x'];
                    return d.fx;
                }
            }).attr("cy", function(d) {
                if (pos.hasOwnProperty(d.id)) {
                    d.fy = pos[d.id]['y'];
                    return d.fy;
                }
            });

            if (!this.forceStopped) {
                this.force.restart();
            }
        }

        //设置节点形状	shape:节点形状
        function nodeSetShape(shape) {
            this.shape = shape;
            var gNodes = _findGNodesById(this.id);
            _drawNodeSymbol(gNodes);
        }
        //设置节点图片 	image:图片的url地址
        function nodeSetImage(image) {
            this.image = image;
            var gNodes = _findGNodesById(this.id);
            _drawNodeSymbol(gNodes);
        }

        //设置节点颜色
        function nodeSetFillColor(color) {
            this.fillColor = color;
            var gNodes = _findGNodesById(this.id);
            _drawNodeSymbol(gNodes);
        }

        //设置节点尺寸
        function nodeSetSize(size) {
            if (typeof size == "object") {
                //兼容两种参数格式
                this.size = size;
            } else {
                this.size = {
                    width: size,
                    height: size
                }
            }
            var gNodes = _findGNodesById(this.id);
            _drawNodeSymbol(gNodes);
            _drawNodeLabel(gNodes);
            //重绘节点标签以保证标签显示在节点之上
        }

        //设置节点css样式
        function nodeSetStyle(style) {
            this.style = style;
            var gNodes = _findGNodesById(this.id);
            _drawNodeSymbol(gNodes);
        }

        //根据node id查找节点标签的svg对象
        function _findGNodesById(id) {
            return d3.selectAll(".node").filter(function(d) {
                return d.id == id;
            })
        }

        //根据link id查找边的svg:Path对象
        function _findGLinksById(id) {
            return d3.selectAll("path.link").filter(function(d) {
                return d.id == id;
            })
        }

        //根据link id查找边箭头的svg:defs对象
        function _findGLinkArrowsById(id) {
            return d3.selectAll("defs.linkarrow").filter(function(d) {
                return d.id == id;
            })
        }

        //根据link id查找边标签的svg:text对象
        function _findGLinkLabelsById(id) {
            return d3.selectAll("text.linklabel").filter(function(d) {
                return d.id == id;
            })
        }

        //设置节点标签
        function nodeSetLabel(label) {
            this.label = label;
            var gNodes = _findGNodesById(this.id);
            _drawNodeLabel(gNodes);
        }

        //add by selena 20181023
        //设置data中的某个属性为节点标签
        function nodeSetLabelData(key) {
            this.setLabel(this["data"][key]);
        }

        //显示标签
        //add by river 20181023
        function nodeShowLabel() {
            switch (this.visualStatus) {
                case DG.VS_NORMAL:
                    this.visualStatus = DG.VS_NORMAL_LABELED;
                    break;
                case DG.VS_BLUR:
                    this.visualStatus = DG.VS_BLUR_LABELED;
                    break;
                case DG.VS_HIGHLIGHT:
                    this.visualStatus = DG.VS_BLUR_LABELED;
                    break;
                default:
                    break;
            }
            var gNodes = _findGNodesById(this.id);
            _drawNodeLabel(gNodes);
        }
        //隐藏标签
        //add by river 20181024
        function nodeHideLabel() {
            switch (this.visualStatus) {
                case DG.VS_NORMAL_LABELED:
                    this.visualStatus = DG.VS_NORMAL;
                    break;
                case DG.VS_BLUR_LABELED:
                    this.visualStatus = DG.VS_BLUR;
                    break;
                case DG.VS_HIGHLIGHT_LABELED:
                    this.visualStatus = DG.VS_BLUR;
                    break;
                default:
                    break;
            }
            var gNodes = _findGNodesById(this.id);
            _drawNodeLabel(gNodes);
        }
        //设置标签相对节点的位置
        function nodeSetLabelPosition(pos, preScale) {
            if (typeof preScale == "undefined") {
                preScale = 1
            }
            this.labelPosition = pos;
            var gNodes = _findGNodesById(this.id);
            _drawNodeLabel(gNodes);
        }
        //设置节点标签CSS样式
        //add by river 20181026
        function nodeSetLabelStyle(style) {
            this.labelStyle = style;
            var gNodes = _findGNodesById(this.id);
            _drawNodeLabel(gNodes);
        }
        //设置节点标签颜色
        function nodeSetLabelColor(color) {
            this.labelColor = color;
            var gNodes = _findGNodesById(this.id);
            _drawNodeLabel(gNodes);
        }
        //设置节点标签字体大小
        function nodeSetLabelFontSize(fontSize) {
            this.labelFontSize = fontSize;
            var gNodes = _findGNodesById(this.id);
            _drawNodeLabel(gNodes);
        }
        //添加事件监听函数
        function nodeAddEventListener(event, handler) {}
        //移除事件监听函数
        function nodeRemoveEventListener(event, handler) {
        }

        //显示边
        function linkShow() {
            this.visualStatus = DG.VS_NORMAL;
            var gLinks = _findGLinksById(this.id);
            _drawLinkSymbol(gLinks);
            var gLinkLabels = _findGLinkLabelsById(this.id);
            _drawLinkLabel(gLinkLabels);
        }
        //隐藏边
        function linkHide() {
            this.visualStatus = DG.VS_NONE;
            var gLinks = _findGLinksById(this.id);
            _drawLinkSymbol(gLinks);
            var gLinkLabels = _findGLinkLabelsById(this.id);
            _drawLinkLabel(gLinkLabels);
        }
        //设计显示/隐藏类型	visualStatus:显示状态
        //add by river 20181026
        function linkSetVisualStatus(visualStatus) {
            this.visualStatus = visualStatus
            var gLinks = _findGLinksById(this.id);
            _drawLinkSymbol(gLinks);
            var gLinkLabels = _findGLinkLabelsById(this.id);
            _drawLinkLabel(gLinkLabels);
        }
        //设置线条形状	shape:线条形状
        function linkSetShape(shape) {
            this.shape = shape;
            var gLinkArrows = _findGLinkArrowsById(this.id);
            _drawLinkArrow(gLinkArrows);
            var gLinks = _findGLinkLabelsById(this.id);
            _drawLinkSymbol(gLinks);

        }
        //设置线条颜色
        function linkSetColor(color) {
            this.color = color;
            var gLink = _findGLinksById(this.id);
            _drawLinkSymbol(gLink);
            var gLinkArrow = _findGLinkArrowsById(this.id);
            _drawLinkArrow(gLinkArrow);
        }
        //设置线条宽度
        function linkSetWidth(width) {
            this.width = width;
            var gLinks = _findGLinksById(this.id);
            _drawLinkSymbol(gLinks);
        }

        //设置线型
        function linkSetLineType(lineType) {
            this.lineType = lineType;
            var gLinks = _findGLinksById(this.id);
            _drawLinkSymbol(gLinks);
        }

        //设置边标签
        function linkSetLabel(label) {
            this.label = label;
            var gLinkLabels = _findGLinkLabelsById(this.id);
            _drawLinkLabel(gLinkLabels);
        }

        //设置边标签颜色
        function linkSetLabelColor(color) {
            this.labelColor = color;
            var gLinkLabels = _findGLinkLabelsById(this.id);
            _drawLinkLabel(gLinkLabels);
        }

        //设置边标签字体大小
        function linkSetLabelFontSize(fontSize) {
            this.labelFontSize = fontSize;
            var gLinkLabels = _findGLinkLabelsById(this.id);
            _drawLinkLabel(gLinkLabels);
        }

        //设置data中的某个属性为边标签
        //add by river 20181025
        function linkSetLabelData(key) {
        }
        //显示边标签
        function linkShowLabel() {
            switch (this.visualStatus) {
                case DG.VS_BLUR:
                    this.visualStatus = DG.VS_BLUR_LABELED;
                    break;
                case DG.VS_HIGHLIGHT:
                    this.visualStatus = DG.VS_HIGHLIGHT_LABELED;
                    break;
                case DG.VS_NORMAL:
                default:
                    this.visualStatus = DG.VS_NORMAL_LABELED;
                    break;
            }
            var gLinkLabels = _findGLinkLabelsById(this.id);
            _drawLinkLabel(gLinkLabels);
        }
        //隐藏边标签
        function linkHideLabel() {
            switch (this.visualStatus) {
                case DG.VS_BLUR_LABELED:
                    this.visualStatus = DG.VS_BLUR;
                    break;
                case DG.VS_HIGHLIGHT_LABELED:
                    this.visualStatus = DG.VS_HIGHLIGHT;
                    break;
                case DG.VS_NORMAL_LABELED:
                default:
                    this.visualStatus = DG.VS_NORMAL;
                    break;
            }
            var gLinkLabels = _findGLinkLabelsById(this.id);
            _drawLinkLabel(gLinkLabels);
        }

        //设置标签相对线条的位置
        function linkSetLabelPosition(pos) {
        }

        //设置节点标签CSS样式
        function linkSetLabelStyle(style) {
            this.labelStyle = style;
            var gLinkLabels = _findGLinkLabelsById(this.id);
            _drawLinkLabel(gLinkLabels);
        }
        //添加事件监听函数
        function linkAddEventListener(event, handler) {
        }
        //移除事件监听函数
        function linkRemoveEventListener(event, handler) {
        }

        //add by levi 20181009
        //移除事件监听函数
        function removeEventListener(event, handler) {
        }
        //添加事件监听函数
        function addEventListener(event, handler) {
        }
        //对图进行布局计算，type:布局算法类型；options:算法对应的参数；each:是否回显布局结果，transition:是否显示过渡；callback：完成布局计算后执行的回调方法。
        function graphLayout(type, options, echo, transition, callback) {
            var _this = this;
            function getChordData(graph, key) {
                var cData = [];
                graph.links.forEach(function(d) {
                    cData.push([d.source.id + ':' + d.source.label, d.target.id + ':' + d.target.label, d.data[key]]);
                });
                return cData;
            }

            if (type == DG.LAYOUT_CIRCLE) {
                if (typeof this.config == "undefined") {
                    _prepareData.call(this, options.container, false);
                }
                var chord = viz.chord().data(getChordData(this, options.key)).label(function(d) {
                    if (d.value != 0) {
                        return d.source.split(':')[1] + " (" + d3.format(",")(d.value) + ")";
                    } else {
                        return "";
                    }

                })
                this.hide();
                //隐藏默认的力导向布局
                this.vis.attr('transform', 'translate(' + this.config.width / 2 + ',' + this.config.height / 2 + ')');
                this.vis.call(chord);
            } else if (type == DG.LAYOUT_FR) {
                var url = "http://192.168.2.215:8082/layout/FruchtermanReingold"
                var params = {
                    "userId": "userId",
                    "seriaNumber": "0000000",
                    "page": "",
                    "pageSize": "",
                    "graph": this.getDataJsonObj(),
                    "data": {
                        "area": 0,
                        "speed": 0,
                        "gravity": 0
                    }
                }
                _this.force.stop();
                _fetchFromBackend(params, url, function(res) {
                    //				console.log(res.data.nodeList);
                    var nodesMove = {};
                    res.data.nodeList.forEach(function(d) {
                        console.log(d);
                        nodesMove[d.id] = {
                            x: Number(d.position.x) + parseFloat(_this.config.width) / 2,
                            y: Number(d.position.y) + parseFloat(_this.config.height) / 2
                        };

                    })
                    myGraph.moveNodesTo(nodesMove);

                });
            } else if (type == DG.LAYOUT_ATLAS2) {
                //			var url="http://192.168.2.215:8082/layout/ForceAtlas2"
                var url = "http://192.168.2.216:8082/test/h"
                var params = {
                    "userId": "userId",
                    "seriaNumber": "0000000",
                    "page": "",
                    "pageSize": "",
                    "graph": this.getDataJsonObj(),
                    "data": {
                        "tolerance": 1,
                        "approximateRepulsion": true,
                        "approximation": 1,
                        "scaling": 1,
                        "strongerGravity": true,
                        "gravity": 1,
                        "dissuadeHubs": true,
                        "linLongMode": true,
                        "preventoverlap": true,
                        "edgeWeightInfluence": 1
                    }
                }
                _this.force.stop();
                _fetchFromBackend(params, url, function(res) {//				console.log(data);
                    ////				console.log(res.data.nodeList);
                    //				var nodesMove = {};
                    //				res.data.nodeList.forEach(function(d){
                    //					console.log(d.position);
                    //					nodesMove[d.id] = {x:Number(d.position.x)+parseFloat(_this.config.width)/2, y:Number(d.position.y)+parseFloat(_this.config.height)/2};
                    ////
                    //					console.log(nodesMove[d.id]);
                    //				})
                    //				myGraph.moveNodesTo(nodesMove);

                });
            } else if (type == DG.LAYOUT_TREE) {
                if (typeof this.config == "undefined") {
                    _prepareData.call(this, options.container, false);
                }
                var treeData = this.buildTreeData(options.rootNode, options.level);
                this.vis.classed("hide", true);
                //隐藏默认力导向图
                // Set the dimensions and margins of the diagram
                var margin = {
                    top: 20,
                    right: 90,
                    bottom: 30,
                    left: 90
                }
                    , width = this.config.width - margin.left - margin.right
                    , height = this.config.height - margin.top - margin.bottom;

                // append the svg object to the body of the page
                // appends a 'group' element to 'svg'
                // moves the 'group' element to the top left margin
                var svg = this.vis0.attr("width", width + margin.right + margin.left).attr("height", height + margin.top + margin.bottom).append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")");

                var i = 0, duration = 750, root;

                // declares a tree layout and assigns the size
                var treemap = d3.tree().size([height, width]);

                // Assigns parent, children, height, depth
                root = d3.hierarchy(treeData, function(d) {
                    return d.children;
                });
                root.x0 = height / 2;
                root.y0 = 0;

                // Collapse after the second level
                root.children.forEach(collapse);

                updateTree(root);

                // Collapse the node and all it's children
                function collapse(d) {
                    if (d.children) {
                        d._children = d.children
                        d._children.forEach(collapse)
                        d.children = null
                    }
                }

                function updateTree(source) {

                    // Assigns the x and y position for the nodes
                    var treeData = treemap(root);

                    // Compute the new tree layout.
                    var nodes = treeData.descendants()
                        , links = treeData.descendants().slice(1);

                    // Normalize for fixed-depth.
                    nodes.forEach(function(d) {
                        d.y = d.depth * 180
                    });

                    // ****************** Nodes section ***************************

                    // Update the nodes...
                    var node = svg.selectAll('g.treenode').data(nodes, function(d) {
                        return d.id || (d.id = ++i);
                    });

                    // Enter any new modes at the parent's previous position.
                    var nodeEnter = node.enter().append('g').attr('class', 'treenode').attr("transform", function(d) {
                        return "translate(" + source.y0 + "," + source.x0 + ")";
                    }).on('click', toggleTreeNode);

                    // Add Circle for the nodes
                    nodeEnter.append('circle').attr('class', 'treenode').attr('r', 1e-6).style("fill", function(d) {
                        return d._children ? "lightsteelblue" : "#fff";
                    });

                    // Add labels for the nodes
                    nodeEnter.append('text').attr("dy", ".35em").attr("x", function(d) {
                        return d.children || d._children ? -13 : 13;
                    }).attr("text-anchor", function(d) {
                        return d.children || d._children ? "end" : "start";
                    }).text(function(d) {
                        return d.data.name;
                    });

                    // UPDATE
                    var nodeUpdate = nodeEnter.merge(node);

                    // Transition to the proper position for the node
                    nodeUpdate.transition().duration(duration).attr("transform", function(d) {
                        return "translate(" + d.y + "," + d.x + ")";
                    });

                    // Update the node attributes and style
                    nodeUpdate.select('circle.treenode').attr('r', 10).style("fill", function(d) {
                        return d._children ? "lightsteelblue" : "#fff";
                    }).attr('cursor', 'pointer');

                    // Remove any exiting nodes
                    var nodeExit = node.exit().transition().duration(duration).attr("transform", function(d) {
                        return "translate(" + source.y + "," + source.x + ")";
                    }).remove();

                    // On exit reduce the node circles size to 0
                    nodeExit.select('circle').attr('r', 1e-6);

                    // On exit reduce the opacity of text labels
                    nodeExit.select('text').style('fill-opacity', 1e-6);

                    // ****************** links section ***************************

                    // Update the links...
                    var link = svg.selectAll('path.treelink').data(links, function(d) {
                        return d.id;
                    });

                    // Enter any new links at the parent's previous position.
                    var linkEnter = link.enter().insert('path', "g").attr("class", "treelink").attr('d', function(d) {
                        var o = {
                            x: source.x0,
                            y: source.y0
                        }
                        return diagonal(o, o)
                    });

                    // UPDATE
                    var linkUpdate = linkEnter.merge(link);

                    // Transition back to the parent element position
                    linkUpdate.transition().duration(duration).attr('d', function(d) {
                        return diagonal(d, d.parent)
                    });

                    // Remove any exiting links
                    var linkExit = link.exit().transition().duration(duration).attr('d', function(d) {
                        var o = {
                            x: source.x,
                            y: source.y
                        }
                        return diagonal(o, o)
                    }).remove();

                    // Store the old positions for transition.
                    nodes.forEach(function(d) {
                        d.x0 = d.x;
                        d.y0 = d.y;
                    });

                    // Creates a curved (diagonal) path from parent to the child nodes
                    function diagonal(s, d) {

                        path = `M ${s.y} ${s.x}
    		            C ${(s.y + d.y) / 2} ${s.x},
    		              ${(s.y + d.y) / 2} ${d.x},
    		              ${d.y} ${d.x}`

                        return path
                    }

                    // Toggle children on click.
                    function toggleTreeNode(d) {
                        if (d.children) {
                            d._children = d.children;
                            d.children = null;
                        } else {
                            d.children = d._children;
                            d._children = null;
                        }
                        updateTree(d);
                    }
                }

            }
        }
        //对图进行统计计算，type:统计类型；option:统计参数。
        function stat(type, option, callback) {
            var _this = this;
            var url = "http://192.168.2.216:8082/Graph/StatisticType";
            var params = {
                "userId": "index",
                "seriaNumber": "11212",
                "page": "123123",
                "pageSize": "123123",
                "graph": this.getDataJsonObj(),
                "data": option
            }
            if (type == DG.STAT_PAGE_RANK) {
                _fetchFromBackend(params, url, function(res) {
                    console.log(res.data.nodes);
                    res.data.nodes.forEach(function(d) {
                        var theNode = myGraph.getNodeById(d.id);
                        if (typeof theNode.stat == "undefined") {
                            theNode.stat = {};
                        }
                        theNode.stat.pageRank = parseFloat(d.pageranks);
                    })
                    console.log(myGraph);
                    callback.call(this);

                }, false);
            } else if (type == DG.STAT_DEGREE) {
                if (_this.nodes.length <= 1000) {
                    var degrees = {};
                    _this.nodes.forEach(function(d) {
                        degrees[d.id] = [0, 0, 0];
                    })
                    _this.links.forEach(function(d) {
                        degrees[d.source.id][0] += 1;
                        degrees[d.target.id][0] += 1;
                    })
                    //				console.log(degrees);

                    for (var key in degrees) {
                        var theNode = _this.getNodeById(key);
                        if (typeof theNode.stat == "undefined") {
                            theNode.stat = {};
                        }
                        theNode.stat.degree = parseInt(degrees[key][0]);
                    }
                    callback.call(this);
                } else {
                    var option = {
                        'id': 'index',
                        'type': DG.STAT_DEGREE
                    }
                    _fetchFromBackend(params, url, function(res) {
                        res.data.degree.forEach(function(d) {
                            var theNode = myGraph.getNodeById(d.id);
                            if (typeof theNode.stat == "undefined") {
                                theNode.stat = {};
                            }
                            theNode.stat.degree = parseInt(d.degree);
                        })
                        //				console.log(myGraph);
                        callback.call(this);
                    });
                }

            } else if (type == DG.STAT_IN_DEGREE) {
                if (_this.nodes.length <= 1000) {
                    var degrees = {};
                    _this.nodes.forEach(function(d) {
                        degrees[d.id] = [0, 0, 0];
                    })
                    _this.links.forEach(function(d) {
                        degrees[d.target.id][1] += 1;
                    })
                    console.log(degrees);
                    for (var key in degrees) {
                        var theNode = _this.getNodeById(key);
                        if (typeof theNode.stat == "undefined") {
                            theNode.stat = {};
                        }
                        theNode.stat.inDegree = parseInt(degrees[key][1]);
                    }
                    callback.call(this);
                } else {
                    var option = {
                        'id': 'index',
                        'type': DG.STAT_IN_DEGREE
                    }
                    _fetchFromBackend(params, url, function(res) {
                        //				console.log(res);
                        //				console.log(res.data.inDegree);
                        res.data.inDegree.forEach(function(d) {
                            console.log(d);
                            var theNode = myGraph.getNodeById(d.id);
                            if (typeof theNode.stat == "undefined") {
                                theNode.stat = {};
                            }
                            theNode.stat.inDegree = parseInt(d.degree);
                        })
                        //				console.log(myGraph);
                        callback.call(this);
                    });
                }

            } else if (type == DG.STAT_OUT_DEGREE) {
                if (_this.nodes.length <= 1000) {
                    var degrees = {};
                    _this.nodes.forEach(function(d) {
                        degrees[d.id] = [0, 0, 0];
                    })
                    _this.links.forEach(function(d) {
                        degrees[d.source.id][1] += 1;
                    })
                    //				console.log(degrees);

                    for (var key in degrees) {
                        var theNode = _this.getNodeById(key);
                        if (typeof theNode.stat == "undefined") {
                            theNode.stat = {};
                        }
                        theNode.stat.outDegree = parseInt(degrees[key][2]);
                    }
                    callback.call(this);
                } else {
                    var option = {
                        'id': 'index',
                        'type': DG.STAT_OUT_DEGREE
                    }
                    _fetchFromBackend(params, url, function(res) {
                        console.log(res);
                        console.log(res.data.inDegree);
                        res.data.outDegree.forEach(function(d) {
                            console.log(d);
                            var theNode = myGraph.getNodeById(d.id);
                            if (typeof theNode.stat == "undefined") {
                                theNode.stat = {};
                            }
                            theNode.stat.outDegree = parseInt(d.degree);
                        })
                        console.log(myGraph);
                        callback.call(this);
                    });
                }

            } else if (type == DG.STAT_DEGREE_CENTRALITY) {
                if (_this.nodes.length <= 1000) {
                    var degrees = {};
                    _this.nodes.forEach(function(d) {
                        degrees[d.id] = [0, 0, 0];
                    })
                    _this.links.forEach(function(d) {
                        degrees[d.source.id][0] += 1;
                        degrees[d.target.id][0] += 1;
                    })
                    //				console.log(degrees);

                    for (var key in degrees) {
                        var theNode = _this.getNodeById(key);
                        if (typeof theNode.stat == "undefined") {
                            theNode.stat = {};
                        }
                        theNode.stat.degreeCentrality = parseFloat(degrees[key][0]) / (_this.nodes.length - 1);
                    }
                    callback.call(this);
                } else {
                    var option = {
                        'id': 'index',
                        'type': DG.STAT_DEGREE_CENTRALITY
                    }
                    _fetchFromBackend(params, url, function(res) {
                        //				console.log(res);
                        //				console.log(res.data.degreeCentrality);
                        res.data.degreeCentrality.forEach(function(d) {
                            //					console.log(d);
                            var theNode = myGraph.getNodeById(d.id);
                            if (typeof theNode.stat == "undefined") {
                                theNode.stat = {};
                            }
                            theNode.stat.degreeCentrality = parseFloat(d.degree);
                        })
                        //				console.log(myGraph);
                        callback.call(this);
                    });
                }

            } else if (type == DG.STAT_CLUSTER) {
                if (_this.nodes.length <= 1000) {
                    var cluster = _getCluster(this);
                    this.nodes.forEach(function(d, i) {
                        if (typeof d.stat == "undefined") {
                            d.stat = {};
                        }
                        d.stat.cluster = cluster[i];
                    })
                    callback.call(this);
                } else {
                    var option = {
                        'id': 'index',
                        'type': 'DG.STAT_CLUSTER'
                    }
                    _fetchFromBackend(params, url, function(res) {
                        console.log(res);
                        console.log(res.data.nodeList);

                        res.data.nodeList.forEach(function(d) {
                            var theNode = myGraph.getNodeById(d.id);
                            if (typeof theNode.stat == "undefined") {
                                theNode.stat = {};
                            }
                            theNode.stat.cluster = [d["cluter-id"]];
                            //						console.log(d["cluter-id"])

                        }, false)
                        callback.call(this);
                        console.log(myGraph);
                    });
                }
            }

        }

        //返回表示聚类结果的结点ID数组
        function _getCluster(graph) {
            var nodes = graph.nodes.map(function(item) {
                //将nodes/links转为netClustering插件要求的格式
                return {
                    name: item.id
                }
            });
            var links = graph.links.map(function(item) {
                return {
                    source: graph.nodes.indexOf(item.source),
                    target: graph.nodes.indexOf(item.target),
                    value: 1
                }
            })
            var res = netClustering.cluster(nodes, links);
            console.log(res);
            var clusterGroup = new Array(nodes.length);
            var currentIndex = [];
            function getClusterIndex(arr) {
                for (var i = 0; i < arr.length; i++) {
                    currentIndex = currentIndex.concat([i]);
                    if (typeof arr[i] == "object") {
                        getClusterIndex(arr[i])
                    } else if (typeof arr[i] == "string") {
                        clusterGroup[arr[i]] = currentIndex.concat();
                    }
                    currentIndex.pop();
                }
            }
            getClusterIndex(res);
            return clusterGroup;
        }

        //添加图的视觉映射
        function addVisualMap(vm) {
            //线性映射差值计算
            function linearMap(ax, ay, x) {
                if (typeof ax != "object" || typeof ay != "object" || ax.length < 2 || ay.length < 2) {
                    return null;
                } else {
                    //				ax.sort(function(a,b){return a -b});
                    //				ay.sort(function(a,b){return a -b});
                    if (ax.length > ay.length) {
                        ax = ax.slice(0, ay.length);
                    } else if (ax.length < ay.length) {
                        ay = ay.slice(0, ax.length);
                    }
                    if (x < ax[0] || x > ax[ax.length - 1]) {
                        return null
                    }
                    for (var i = 0; i < ax.length - 1; i++) {
                        var x0 = ax[i]
                            , x1 = ax[i + 1];
                        if (x >= x0 && x <= x1) {
                            var y0 = ay[i]
                                , y1 = ay[i + 1];
                            var y;
                            if (x1 == x0) {
                                y = (y0 + y1) / 2;
                            } else {
                                y = (x1 - x) * y0 / (x1 - x0) + (x - x0) * y1 / (x1 - x0);
                            }
                            return y;
                        }
                    }
                }

            }
            //查表映射差值计算
            function catMap(ax, ay, x) {
                if (typeof ax != "object" || typeof ay != "object") {
                    return false;
                } else {
                    if (ax.length > ay.length) {
                        ax = ax.slice(0, ay.length);
                    } else if (ax.length < ay.length) {
                        ay = ay.slice(0, ax.length);
                    }
                    var i = ax.indexOf(x);
                    if (i != -1) {
                        var y = ay[i];
                        return y;
                    } else {
                        return false;
                    }
                }
            }

            //范围映射计算
            function rangeMap(ax, ay, x) {
                if (typeof ax != "object" || typeof ay != "object" || ax.length < 2 || ay.length < 1) {
                    return false;
                } else {
                    //				ax.sort(function(a,b){return a -b});
                    //				ay.sort(function(a,b){return a -b});
                    if (ax.length > ay.length + 1) {
                        ax = ax.slice(0, ay.length + 1);
                    } else if (ax.length < ay.length) {
                        ay = ay.slice(0, ax.length - 1);
                    }
                    if (x < ax[0] || x > ax[ax.length - 1]) {
                        return false
                    }
                    for (var i = 0; i < ax.length - 1; i++) {
                        var x0 = ax[i]
                            , x1 = ax[i + 1];
                        if (x >= x0 && x < x1) {
                            var y = ay[i];
                            return y;
                        }
                    }
                    if (x == ax[ax.length - 1]) {
                        return ay[ay.length - 1]
                    } else {
                        return false
                    }
                }

            }

            function colorMap(symbols, dataGroup, dataKey, colorKey, mapDatas, mapColors) {
                var aR = []
                    , aG = []
                    , aB = [];
                mapColors.forEach(function(d) {
                    var rgb = d.rgbValues();
                    aR.push(rgb[0]);
                    aG.push(rgb[1]);
                    aB.push(rgb[2]);
                })
                symbols.forEach(function(d) {
                    var r = linearMap(mapDatas, aR, d[dataGroup][dataKey]);
                    var g = linearMap(mapDatas, aG, d[dataGroup][dataKey]);
                    var b = linearMap(mapDatas, aB, d[dataGroup][dataKey]);
                    if (r != null && g != null && b != null) {
                        d[colorKey] = 'rgb(' + r + ',' + g + ',' + b + ')';
                    }
                })
            }

            function sizeMap(symbols, dataGroup, dataKey, sizeKey, mapDatas, mapSizes) {
                var aWidth = []
                    , aHeight = [];
                mapSizes.forEach(function(d) {
                    aWidth.push(typeof d == "object" ? parseInt(d.width) : parseInt(d));
                    aHeight.push(typeof d == "object" ? parseInt(d.height) : parseInt(d));
                })
                symbols.forEach(function(d) {
                    var width = linearMap(mapDatas, aWidth, d[dataGroup][dataKey]);
                    var height = linearMap(mapDatas, aHeight, d[dataGroup][dataKey]);
                    d[sizeKey] = {
                        "width": width,
                        "height": height
                    };
                })
            }

            function lengthMap(symbols, dataGroup, dataKey, lengthKey, mapDatas, mapLengths) {
                var aLength = [];
                mapLengths.forEach(function(d) {
                    aLength.push(parseInt(d));
                })
                symbols.forEach(function(d) {
                    var length = linearMap(mapDatas, aLength, d[dataGroup][dataKey]);
                    d[lengthKey] = length;
                })
            }

            if (vm.type == DG.VM_LINEAR) {
                if (vm.dimension.type == DG.VM_DIM_NODE_DATA || vm.dimension.type == DG.VM_DIM_STATISTIC) {
                    //数据或统计字段位置
                    var dataGroup = vm.dimension.type == DG.VM_DIM_NODE_DATA ? "data" : "stat";
                    //节点颜色映射
                    if (typeof vm.target.nodeColors == "object") {
                        colorMap(this.nodes, dataGroup, vm.dimension.dataKey, 'fillColor', vm.dimension.values, vm.target.nodeColors);
                    }
                    //节点大小映射
                    if (typeof vm.target.nodeSizes == "object") {
                        sizeMap(this.nodes, dataGroup, vm.dimension.dataKey, 'size', vm.dimension.values, vm.target.nodeSizes);
                    }
                    //节点标签颜色映射
                    if (typeof vm.target.nodeLabelColors == "object") {
                        colorMap(this.nodes, dataGroup, dataGroup, vm.dimension.dataKey, 'labelColor', vm.dimension.values, vm.target.nodeLabelColors);
                    }
                    //节点标签字体大小映射
                    if (typeof vm.target.nodeLabelFontSizes == "object") {
                        lengthMap(this.nodes, dataGroup, vm.dimension.dataKey, 'labelFontSize', vm.dimension.values, vm.target.nodeLabelFontSizes);
                    }
                } else if (vm.dimension.type == DG.VM_DIM_LINK_DATA) {
                    //边颜色映射
                    if (typeof vm.target.linkColors == "object") {
                        colorMap(this.links, "data", vm.dimension.dataKey, 'color', vm.dimension.values, vm.target.linkColors);
                    }
                    //边宽度映射
                    if (typeof vm.target.linkWidths == "object") {
                        lengthMap(this.links, "data", vm.dimension.dataKey, 'width', vm.dimension.values, vm.target.linkWidths);
                    }
                    //边标签颜色映射
                    if (typeof vm.target.linkLabelColors == "object") {
                        colorMap(this.links, "data", vm.dimension.dataKey, 'labelColor', vm.dimension.values, vm.target.linkLabelColors);
                    }
                    //边标签字体大小映射
                    if (typeof vm.target.linkLabelFontSizes == "object") {
                        lengthMap(this.links, "data", vm.dimension.dataKey, 'labelFontSize', vm.dimension.values, vm.target.linkLabelFontSizes);
                    }
                }
            } else if (vm.type == DG.VM_CATEGORY) {
                if (vm.dimension.type == DG.VM_DIM_NODE_DATA || vm.dimension.type == DG.VM_DIM_STATISTIC) {
                    var dataGroup = vm.dimension.type == DG.VM_DIM_NODE_DATA ? "data" : "stat";
                    this.nodes.forEach(function(d) {
                        //节点颜色映射
                        if (typeof vm.target.nodeColors == "object") {
                            var s = catMap(vm.dimension.values, vm.target.nodeColors, d[dataGroup][vm.dimension.dataKey]);
                            if (s) {
                                d.fillColor = s;
                            }
                        }
                        //节点大小映射
                        if (typeof vm.target.nodeSizes == "object") {
                            var s = catMap(vm.dimension.values, vm.target.nodeSizes, d[dataGroup][vm.dimension.dataKey]);
                            if (typeof s == "object") {
                                d.size = s;
                            } else if (s) {
                                d.size = {
                                    "width": s,
                                    "height": s
                                }
                            }
                        }
                        //节点标签颜色映射
                        if (typeof vm.target.nodeLabelColors == "object") {
                            var s = catMap(vm.dimension.values, vm.target.nodeLabelColors, d[dataGroup][vm.dimension.dataKey]);
                            if (s) {
                                d.labelColor = s;
                            }
                        }
                        //节点标签字体大小映射
                        if (typeof vm.target.nodeLabelFontSizes == "object") {
                            var s = catMap(vm.dimension.values, vm.target.nodeLabelFontSizes, d[dataGroup][vm.dimension.dataKey]);
                            if (s) {
                                d.labelFontSize = s;
                            }

                        }
                    })
                } else if (vm.dimension.type == DG.VM_DIM_CLUSTER) {
                    this.nodes.forEach(function(d) {
                        //节点颜色映射
                        if (typeof vm.target.nodeColors == "object") {
                            var s = catMap(vm.dimension.values, vm.target.nodeColors, d.stat.cluster[0]);
                            if (s) {
                                d.fillColor = s;
                            }
                        }
                        //节点大小映射
                        if (typeof vm.target.nodeSizes == "object") {
                            var s = catMap(vm.dimension.values, vm.target.nodeSizes, d.stat.cluster[0]);
                            if (typeof s == "object") {
                                d.size = s;
                            } else if (s) {
                                d.size = {
                                    "width": s,
                                    "height": s
                                }
                            }
                        }
                        //节点标签颜色映射
                        if (typeof vm.target.nodeLabelColors == "object") {
                            var s = catMap(vm.dimension.values, vm.target.nodeLabelColors, d.stat.cluster[0]);
                            if (s) {
                                d.labelColor = s;
                            }
                        }
                        //节点标签字体大小映射
                        if (typeof vm.target.nodeLabelFontSizes == "object") {
                            var s = catMap(vm.dimension.values, vm.target.nodeLabelFontSizes, d.stat.cluster[0]);
                            if (s) {
                                d.labelFontSize = s;
                            }

                        }
                    })
                } else if (vm.dimension.type == DG.VM_DIM_LINK_DATA) {
                    this.links.forEach(function(d) {
                        //边颜色映射
                        if (typeof vm.target.linkColors == "object") {
                            var s = catMap(vm.dimension.values, vm.target.linkColors, d.data[vm.dimension.dataKey]);
                            if (s) {
                                d.color = s;
                            }
                        }
                        //边宽度映射
                        if (typeof vm.target.linkWidths == "object") {
                            var s = catMap(vm.dimension.values, vm.target.linkWidths, d.data[vm.dimension.dataKey]);
                            if (s) {
                                d.width = s;
                            }
                        }
                        //边标签颜色映射
                        if (typeof vm.target.linkLabelColors == "object") {
                            var s = catMap(vm.dimension.values, vm.target.linkLabelColors, d.data[vm.dimension.dataKey]);
                            if (s) {
                                d.labelColor = s;
                            }
                        }
                        //边标签字体大小映射
                        if (typeof vm.target.linkLabelFontSizes == "object") {
                            var s = catMap(vm.dimension.values, vm.target.linkLabelFontSizes, d.data[vm.dimension.dataKey]);
                            if (s) {
                                d.labelFontSize = s;
                            }
                        }
                    })
                }
            } else if (vm.type == DG.VM_RANGE) {
                if (vm.dimension.type == DG.VM_DIM_NODE_DATA || vm.dimension.type == DG.VM_DIM_STATISTIC) {
                    var dataGroup = vm.dimension.type == DG.VM_DIM_NODE_DATA ? "data" : "stat";
                    this.nodes.forEach(function(d) {
                        //节点颜色映射
                        if (typeof vm.target.nodeColors == "object") {
                            var s = rangeMap(vm.dimension.values, vm.target.nodeColors, d[dataGroup][vm.dimension.dataKey]);
                            if (s) {
                                d.fillColor = s;
                            }
                        }
                        //节点大小映射
                        if (typeof vm.target.nodeSizes == "object") {
                            var s = rangeMap(vm.dimension.values, vm.target.nodeSizes, d[dataGroup][vm.dimension.dataKey]);
                            if (typeof s == "object") {
                                d.size = s;
                            } else if (s) {
                                d.size = {
                                    "width": s,
                                    "height": s
                                }
                            }
                        }
                        //节点标签颜色映射
                        if (typeof vm.target.nodeLabelColors == "object") {
                            var s = rangeMap(vm.dimension.values, vm.target.nodeLabelColors, d[dataGroup][vm.dimension.dataKey]);
                            if (s) {
                                d.labelColor = s;
                            }
                        }
                        //节点标签字体大小映射
                        if (typeof vm.target.nodeLabelFontSizes == "object") {
                            var s = rangeMap(vm.dimension.values, vm.target.nodeLabelFontSizes, d[dataGroup][vm.dimension.dataKey]);
                            if (s) {
                                d.labelFontSize = s;
                            }

                        }
                    })
                } else if (vm.dimension.type == DG.VM_DIM_LINK_DATA) {
                    this.links.forEach(function(d) {
                        //边颜色映射
                        if (typeof vm.target.linkColors == "object") {
                            var s = rangeMap(vm.dimension.values, vm.target.linkColors, d.data[vm.dimension.dataKey]);
                            if (s) {
                                d.color = s;
                            }
                        }
                        //边宽度映射
                        if (typeof vm.target.linkWidths == "object") {
                            var s = rangeMap(vm.dimension.values, vm.target.linkWidths, d.data[vm.dimension.dataKey]);
                            if (s) {
                                d.width = s;
                            }
                        }
                        //边标签颜色映射
                        if (typeof vm.target.linkLabelColors == "object") {
                            var s = rangeMap(vm.dimension.values, vm.target.linkLabelColors, d.data[vm.dimension.dataKey]);
                            if (s) {
                                d.labelColor = s;
                            }
                        }
                        //边标签字体大小映射
                        if (typeof vm.target.linkLabelFontSizes == "object") {
                            var s = rangeMap(vm.dimension.values, vm.target.linkLabelFontSizes, d.data[vm.dimension.dataKey]);
                            if (s) {
                                d.labelFontSize = s;
                            }
                        }
                    })
                }

            }

            this.update();
        }
        //缩放到某一级别
        function zoomTo(level) {
        }
        //缩放相对级别
        function zoomBy(level) {
        }

        //隐藏边
        function hideLinks(links) {
            if (arguments.length == 0) {
                //不带参数时隐藏所有边
                links = this.links;
            }
            links.forEach(function(d) {
                d.visualStatus = DG.VS_NONE;
            });
            this.update();
        }
        //显示边		state:true/false
        function showLinks(links) {
            if (arguments.length == 0) {
                //不带参数时显示所有边
                links = this.links;
            }

            links.forEach(function(d) {
                d.visualStatus = DG.VS_NORMAL;
            });
            this.update();
        }
        //隐藏所有节点标签
        function hideNodeLabels() {
            this.nodes.forEach(function(d) {
                if (d.visualStatus == DG.VS_BLUR_LABELED) {
                    d.visualStatus = DG.VS_BLUR;
                } else if (d.visualStatus == DG.VS_HIGHLIGHT_LABELED) {
                    d.visualStatus = DG.VS_HIGHLIGHT;
                } else if (d.visualStatus == DG.VS_NORMAL_LABELED || typeof d.visualStatus == "undefined") {
                    d.visualStatus = DG.VS_NORMAL;
                }
            })
            this.update();
        }
        //显示所有节点标签
        function showNodeLabels() {
            this.nodes.forEach(function(d) {
                if (d.visualStatus == DG.VS_BLUR) {
                    d.visualStatus = DG.VS_BLUR_LABELED;
                } else if (d.visualStatus == DG.VS_HIGHLIGHT) {
                    d.visualStatus = DG.VS_HIGHLIGHT_LABELED;
                } else if (d.visualStatus == DG.VS_NORMAL || typeof d.visualStatus == "undefined") {
                    d.visualStatus = DG.VS_NORMAL_LABELED;
                }
            })
            this.update();
        }

        //设置所有节点标签字段
        function graphSetNodeLabelData(key, update) {
            this.nodes.forEach(function(d) {
                d.label = d.data[key];
            })
            if (typeof update == "undefined" || update) {
                this.update();
            }

        }

        //隐藏所有边标签
        function hideLinkLabels() {
            this.links.forEach(function(d) {
                if (d.visualStatus == DG.VS_BLUR_LABELED) {
                    d.visualStatus = DG.VS_BLUR;
                } else if (d.visualStatus == DG.VS_HIGHLIGHT_LABELED) {
                    d.visualStatus = DG.VS_HIGHLIGHT;
                } else if (d.visualStatus == DG.VS_NORMAL_LABELED || typeof d.visualStatus == "undefined") {
                    d.visualStatus = DG.VS_NORMAL;
                }
            })
            this.update();
        }
        //显示所有边标签
        function showLinkLabels() {
            this.links.forEach(function(d) {
                if (d.visualStatus == DG.VS_BLUR) {
                    d.visualStatus = DG.VS_BLUR_LABELED;
                } else if (d.visualStatus == DG.VS_HIGHLIGHT) {
                    d.visualStatus = DG.VS_HIGHLIGHT_LABELED;
                } else if (d.visualStatus == DG.VS_NORMAL || typeof d.visualStatus == "undefined") {
                    d.visualStatus = DG.VS_NORMAL_LABELED;
                }
            })
            this.update();
        }

        //设置边形状
        function setLinksShape(links, shape) {
            if (arguments.length == 1) {
                shape = arguments[0];
                links = this.links;
            }
            links.forEach(function(d) {
                d.shape = shape;
            })
            this.update();
        }

        //显示边箭头
        function showLinkArrows(links) {
            if (arguments.length == 0) {
                links = this.links;
            }
            links.forEach(function(d) {
                if (d.shape == DG.LINK_SHAPE_STRIP || typeof d.shape == "undefined") {
                    d.shape = DG.LINK_SHAPE_STRIP_ARROW;
                } else if (d.shape == DG.LINK_SHAPE_ARC) {
                    d.shape = DG.LINK_SHAPE_ARC_ARROW;
                }
            })
            this.update();
        }

        //显示边箭头
        function hideLinkArrows(links) {
            if (arguments.length == 0) {
                links = this.links;
            }
            links.forEach(function(d) {
                if (d.shape == DG.LINK_SHAPE_STRIP_ARROW) {
                    d.shape = DG.LINK_SHAPE_STRIP;
                } else if (d.shape == DG.LINK_SHAPE_ARC_ARROW) {
                    d.shape = DG.LINK_SHAPE_ARC;
                }
            })
            this.update();
        }

        //隐藏节点
        function hideNodes(nodes, flag) {
            if (arguments.length == 0) {
                //不带参数时隐藏所有节点
                nodes = this.nodes;
            }
            nodes.forEach(function(d) {
                d.visualStatus = DG.VS_NONE;
            });

            if (flag) {
                //flag == true时同时隐藏相关边
                this.links.forEach(function(d) {
                    var idxS = nodes.indexOf(d.source);
                    var idxT = nodes.indexOf(d.target);
                    if (idxS > -1 || idxT > -1) {
                        d.visualStatus = DG.VS_NONE;
                    }
                })
            }
            this.update();
        }
        //显示所有节点
        function showNodes(nodes, flag) {

            if (arguments.length == 0) {
                //不带参数时显示所有节点
                nodes = this.nodes;
            }
            nodes.forEach(function(d) {
                d.visualStatus = DG.VS_NORMAL;
            });

            if (flag) {
                //flag == true时同时显示相关边
                var showedNodes = this.nodes.filter(function(d) {
                    return d.visualStatus != DG.VS_NONE;
                })
                this.links.forEach(function(d) {
                    var idxS = showedNodes.indexOf(d.source);
                    var idxT = showedNodes.indexOf(d.target);
                    if (idxS > -1 && idxT > -1) {
                        d.visualStatus = DG.VS_NORMAL;
                    }
                })
            }
            this.update();

        }
        //显示所有
        function showAll() {
            this.nodes.forEach(function(d) {
                d.visualStatus = DG.VS_NORMAL_LABELED;
            });
            this.links.forEach(function(d) {
                d.visualStatus = DG.VS_NORMAL_LABELED;
            });
            this.update();
        }
        //隐藏图
        function graphHide() {
            this.hideNodes();
            this.hideLinks();
        }
        //在容器中刷新显示图
        function update(container) {
            if (!container) {
                container = this.defaultContainer;
            }

            /********************************************************************************************/
            /***********                         更新this.config                      ********************/
            /********************************************************************************************/
            this.config.data.nodes = this.nodes;
            this.config.data.links = this.links;
            _attachNodes(this.config);

            var _this = this;

            /********************************************************************************************/
            /***********                                更新边箭头                                       ********************/
            /********************************************************************************************/
            /////***********选择边箭头集合，绑定新数据并设为以id为键进行对应  **********/////
            this.__gLinkArrows = this.vis.selectAll('.linkarrow').data(this.config.data.links, function(d) {
                return d.id;
            });
            //****************exit部分（删除边箭头）处理****************/////////
            var _gLinkArrows2Remove = this.__gLinkArrows.exit();
            _gLinkArrows2Remove.remove();

            //****************update部分（编辑边箭头）处理****************/////////
            this.__gLinkArrows.selectAll("marker").remove();
            _drawLinkArrow(this.__gLinkArrows);

            //////////*********enter部分（新增边标签）处理 ****************///////////
            //1.在边的中点位置绘制边标签
            var _gLinkArrows2Add = this.__gLinkArrows.enter().append("svg:defs").attr("class", "linkarrow");
            _drawLinkArrow(_gLinkArrows2Add);

            //2. 重新定义this.__gLinkArrows, 包含所有边箭头
            this.__gLinkArrows = this.vis.selectAll('.linkarrow');

            /********************************************************************************************/
            /***********                                  更新边                                                   ********************/
            /********************************************************************************************/

            /////***********选择边集合，绑定新数据并设为以id为键进行对应  **********/////
            this.__gLinks = this.vis.selectAll(".link").data(this.config.data.links, function(d) {
                return d.id
            });

            //****************exit部分（删除边）处理****************/////////
            var _gLinks2Remove = this.__gLinks.exit();
            _gLinks2Remove.remove();

            //****************update部分（编辑边）处理****************/////////
            _drawLinkSymbol(this.__gLinks);

            //////////*********enter部分（新增边）处理 ****************///////////

            //1. 根据source/target节点位置绘制边
            var _gLinks2Add = this.__gLinks.enter().append("svg:path").attr("id", function(d) {
                return "lp" + d.id;
            }).attr("class", "link").attr("fill", "none")
            //2. 给新增边添加样式
            _drawLinkSymbol(_gLinks2Add);
            //3. 重新定义this.__gLinks, 包含所有边
            this.__gLinks = this.vis.selectAll(".link");

            /********************************************************************************************/
            /***********                                更新边标签                                       ********************/
            /********************************************************************************************/
            /////***********选择边标签集合，绑定新数据并设为以id为键进行对应  **********/////
            this.__gLinkLabels = this.vis.selectAll('.linklabel').data(this.config.data.links, function(d) {
                return d.id;
            })
            //****************exit部分（删除边标签）处理****************/////////
            var _gLinkLabels2Remove = this.__gLinkLabels.exit();
            _gLinkLabels2Remove.remove();

            //****************update部分（编辑边标签）处理****************/////////
            this.__gLinkLabels.selectAll("textPath").remove();
            _drawLinkLabel(this.__gLinkLabels);
            //
            //		this.__gLinkLabels.select("textPath").attr("style", function(d) {
            //			return d.labelStyle;
            //		}).text(function(d) {
            //			return d.label;
            //		});
            //
            //////////*********enter部分（新增边标签）处理 ****************///////////
            //1.在边的中点位置绘制边标签
            var _gLinkLabels2Add = this.__gLinkLabels.enter().append("text").attr("class", "linklabel");

            //		.append("text").attr("class", "linklabel")
            //		.attr("linkId", function(d){
            //			return d.id;
            //		}).attr("x", function(d) {
            //			return(d.source.x + d.target.x) / 2
            //		}).attr("y", function(d) {
            //			return(d.source.y + d.target.y) / 2
            //		}).attr("style", function(d) {
            //			return d.labelStyle;
            //		})

            _drawLinkLabel(_gLinkLabels2Add);

            //2. 重新定义this.__gLinkLabels, 包含所有边标签
            this.__gLinkLabels = this.vis.selectAll('.linklabel');

            /***************************************************/
            /***********           更新节点       ********************/
            /**************************************************/

            ///////////*********设置节点事件处理函数 ****************///////////
            //方式1. 这种方式下节点拖拽时暂停力导向，只移动一个节点
            var dragstart = function(d) {
                _this.force.stop();
                d3.event.sourceEvent.stopPropagation();
            };
            var dragmove = function(d) {
                d.px += d3.event.dx;
                d.py += d3.event.dy;
                d.x += d3.event.dx;
                d.y += d3.event.dy;
                _this.tick()
            };
            var dragend = function(d) {
                d3.event.subject.fx = null;
                d3.event.subject.fy = null;
                _this.force.restart();
                _this.tick()
            };

            //方式2. 这种方式下节点拖拽时力导向不停止，拖拽时其它节点位置会有变化
            //		var dragstart = function(d) {
            //			if(!d3.event.active)
            //				_this.force.alphaTarget(0.003).restart();
            //			d.fx = d.x;
            //			d.fy = d.y;
            //		}
            //		var dragmove = function(d) {
            //			d.fx = d3.event.x;
            //			d.fy = d3.event.y;
            //		}
            //		var dragend = function(d) {
            //			if(!d3.event.active)
            //				_this.force.alphaTarget(0);
            //		}
            //初始节点拖拽事件
            if (typeof this.__nodeDrag == "undefined") {
                this.__nodeDrag = d3.drag().on("start", dragstart).on("drag", dragmove).on("end", dragend);
            }

            //2. 显示提示信息函数
            this.showToolTip = function(obj) {
                if (obj) {
                    _this.tooltip.html("<div class='title'>" + obj.id + ":" + obj.label + "</div>").style("left", (d3.event.pageX + 10) + "px").style("top", (d3.event.pageY - 20) + "px").style("opacity", 1.0)
                } else {
                    _this.tooltip.style("opacity", 0.0)
                }
            }
            ;

            /////***********选择节点集合，绑定新数据并设为以id为键进行对应  **********/////
            //		console.log(this.config.data.nodes)
            this.__gNodes = this.vis.selectAll("g.node").data(this.config.data.nodes, function(d) {
                return d.id
            });

            //****************exit部分（删除节点）处理****************/////////
            var _gNodesExit = this.__gNodes.exit();
            _gNodesExit.remove();

            //****************update部分（编辑节点）处理****************/////////
            this.__gNodes.selectAll("*").remove();
            _drawNodeSymbol(this.__gNodes, this.preScale);
            _drawNodeLabel(this.__gNodes, this.preScale);

            //////////*********enter部分（新增节点）处理 ****************///////////
            //1.绘制节点元素
            this.__gNodes = this.__gNodes.enter().append("svg:g").attr("class", "node");
            //2.设置节点样式
            _drawNodeSymbol(this.__gNodes, this.preScale);
            //3.绘制节点标签
            _drawNodeLabel(this.__gNodes, this.preScale);
            //4.绑定鼠标拖拽节点事件
            this.__gNodes.call(_this.__nodeDrag);

            //5.绑定鼠标移入节点事件
            this.__gNodes.on('mouseover', function(d) {
                if (_this.__gNodes.mouseoutTimeout) {
                    //超时结束前再次移入鼠标则先清除超时
                    clearTimeout(_this.__gNodes.mouseoutTimeout);
                    _this.__gNodes.mouseoutTimeout = null
                }
                //_this.showToolTip(d)
            }).on('mouseout', function() {
                if (_this.__gNodes.mouseoutTimeout) {
                    //超时结束前再次移出鼠标则先清除超时
                    clearTimeout(_this.__gNodes.mouseoutTimeout);
                    _this.__gNodes.mouseoutTimeout = null
                }
                //设置鼠标移出超时，tooltip可保留一段时间用于操作
                _this.__gNodes.mouseoutTimeout = setTimeout(function() {
                    _this.showToolTip(null)
                }, 300)
            });
            //绑定点击节点事件（高亮相邻结点）
            this.__gNodes.on("click", function(d) {
                //_this.highlightNodeAndItsNeighbors(d);
                d3.event.stopPropagation()
            });

            //重新定义this.__gNodes,包含所有节点
            this.__gNodes = this.vis.selectAll("g.node");

            //重置force simulation
            this.force.nodes(this.config.data.nodes);
            this.force.force("link", d3.forceLink(this.config.data.links).distance(this.config.distance));
            this.force.alpha(1).restart();

            //_this.force.restart();
        }
        //设置节点尺寸并将节点定位移动到图形中心的公共方法
        function _setSymbolSize(symbol, preScale) {
            if (typeof preScale == "undefined") {
                preScale = 1
            }
            symbol.attr("x", function(d) {
                //x,y的偏移量，让节点以图标中心而非左上角定位
                return parseInt(d.size.width) * preScale / -2;
            }).attr("y", function(d) {
                return parseInt(d.size.height) * preScale / -2;
            }).attr('width', function(d) {
                return parseInt(d.size.width);
            }).attr('height', function(d) {
                return parseInt(d.size.height);
            })
        }

        //给图标节点设置nodeId属性
        function _setNodeId(sNodes) {
            sNodes.attr("nodeId", function(d) {
                return d.id
            })
        }

        //给图标设置visualStatus
        function _setSymbolVS(symbols) {
            symbols.classed("active", function(d) {
                return d.visualStatus == DG.VS_NORMAL_LABELED || d.visualStatus == DG.VS_NORMAL || typeof d.visualStatus == "undefined";
            }).classed("hide", function(d) {
                return d.visualStatus == DG.VS_NONE;
            }).classed("inactive", function(d) {
                return d.visualStatus == DG.VS_BLUR_LABELED || d.visualStatus == DG.VS_BLUR;
            }).classed("highlight", function(d) {
                return d.visualStatus == DG.VS_HIGHLIGHT_LABELED || d.visualStatus == DG.VS_HIGHLIGHT;
            });
        }

        //给标签设置visualStatus
        function _setLabelVS(labels) {
            labels.classed("active", function(d) {
                return d.visualStatus == DG.VS_NORMAL_LABELED;
            }).classed("hide", function(d) {
                return d.visualStatus == DG.VS_NORMAL || d.visualStatus == DG.VS_BLUR || d.visualStatus == DG.VS_HIGHLIGHT || d.visualStatus == DG.VS_NONE || typeof d.visualStatus == "undefined";
            }).classed("inactive", function(d) {
                return d.visualStatus == DG.VS_BLUR_LABELED;
            }).classed("highlight", function(d) {
                return d.visualStatus == DG.VS_HIGHLIGHT_LABELED;
            });
        }

        //绘制边图标
        function _drawLinkSymbol(gLinks) {

            gLinks.attr("marker-end", function(d) {
                return "url(#arrow" + d.id + ")";
            }).attr('stroke-width', function(d) {
                return d.width;
            }).attr('stroke', function(d) {
                return d.color;
            }).attr('stroke-dasharray', function(d) {
                if (d.lineType == DG.LINE_DASHED) {
                    return "10,10";
                } else if (d.lineType == DG.LINE_DOTTED) {
                    return "5,5";
                } else if (d.lineType == DG.LINE_DASH_DOTTED) {
                    return "20,10,5,5,5,10";
                }
            }).call(_setSymbolVS);

        }

        //绘制边箭头
        function _drawLinkArrow(gLinkArrows) {
            gLinkArrows.select("marker").remove();
            gLinkArrows.filter(function(d) {
                return d.shape == DG.LINK_SHAPE_STRIP_ARROW || d.shape == DG.LINK_SHAPE_ARC_ARROW;
            }).append("svg:marker").attr("id", function(d) {
                return "arrow" + d.id;
            }).attr('class', 'arrow').attr("markerUnits", "userSpaceOnUse").attr("orient", "auto").attr("viewBox", "0 -5 10 10").attr("refX", function(d) {
                return (parseInt(d.target.size.width) + parseInt(d.target.size.height)) * 2.5 / (parseInt(d.width) * 3) + 10;
            }).attr("refY", 0).attr("markerWidth", function(d) {
                return parseInt(d.width) * 3;
            }).attr("markerHeight", function(d) {
                return parseInt(d.width) * 6;
            }).attr('fill', function(d) {
                return d.color;
            }).append("svg:path").attr("d", "M0,-5L10,0L0,5");
        }

        //绘制边标签
        function _drawLinkLabel(gLinkLabels) {
            gLinkLabels.select("textPath").remove();
            gLinkLabels.call(_setLabelVS).append('avg:textPath').attr("startOffset", "50%").attr("text-anchor", "middle").attr("xlink:href", function(d) {
                if (d.source.id == d.target.id) {
                    return false;
                    //不应该有指向自己的关系 异常处理
                } else {
                    return "#lp" + d.id;
                }
            }).attr('fill', function(d) {
                return d.labelColor;
            }).attr('font-size', function(d) {
                return d.labelFontSize;
            }).attr('style', function(d) {
                return d.labelStyle;
            }).text(function(d) {
                return d.label;
            }).call(d3.drag());
        }

        //绘制节点图标
        function _drawNodeSymbol(gNodes, preScale) {
            //默认缩放
            if (typeof preScale == "undefined") {
                preScale = 1
            }
            //删除原有图票元素
            gNodes.selectAll("[nodeId]").remove();

            //绘制每个圆形节点
            gNodes.filter(function(d) {
                return typeof d.symbolType == "undefined" || d.symbolType == DG.NODE_GEOMETRY && d.shape == DG.NODE_SHAPE_CIRCLER || d.symbolType == DG.NODE_GEOMETRY && typeof d.shape == "undefined";
                //几何类节点默认圆形
            }).append("ellipse").call(_setNodeId).attr('rx', function(d) {
                return parseInt(d.size.width) / 2;
                //width中带px自动去掉
            }).attr('ry', function(d) {
                return parseInt(d.size.height) / 2;
                //width中带px自动去掉
            }).attr('fill', function(d) {
                return d.fillColor;
            }).attr('style', function(d) {
                return d.style
            });

            //绘制每个文字标签节点
            gNodes.filter(function(d) {
                return d.symbolType == DG.NODE_TEXT
            }).append("svg:text").call(_setNodeId).attr("dominant-baseline", "middle").attr("text-anchor", "middle")//在圆圈中加上数据
                .text(function(d) {
                    return d.label
                }).attr("style", function(d) {
                return d.style
            });

            //绘制每个方形节点
            gNodes.filter(function(d) {
                return d.symbolType == DG.NODE_GEOMETRY && d.shape == DG.NODE_SHAPE_RECT;
            }).append("rect").call(_setNodeId).attr('fill', function(d) {
                return d.fillColor;
            }).attr('style', function(d) {
                return d.style
            }).call(_setSymbolSize, preScale);

            //绘制每个星形节点
            gNodes.filter(function(d) {
                return d.symbolType == DG.NODE_GEOMETRY && d.shape == DG.NODE_SHAPE_STAR;
            }).append("polygon").call(_setNodeId).attr('points', function(d) {
                //五角星顶点坐标 "0,-100 59,81 -95,-31 95,-31 -59,81 0,-100";
                var w = parseInt(d.size.width);
                var h = parseInt(d.size.height);
                var starPoints = "0," + -0.5 * h + " " + 0.295 * w + "," + 0.405 * h + " " + -0.475 * w + "," + -0.155 * h + " " + 0.475 * w + "," + -0.155 * h + " " + -0.295 * w + "," + 0.405 * h + " 0," + -0.5 * h;
                return starPoints;
            }).attr('fill', function(d) {
                return d.fillColor;
            }).attr('style', function(d) {
                return d.style
            }).call(_setSymbolSize, preScale);

            //给每个图片类节点添加图片
            gNodes.filter(function(d) {
                return d.symbolType == DG.NODE_IMAGE;
            }).append("svg:image").call(_setNodeId).attr("xlink:href", function(d) {
                return d.image
            }).attr('style', function(d) {
                return d.style
            }).call(_setSymbolSize, preScale);

            //设置每个节点的显示状态
            gNodes.call(_setSymbolVS);

        }

        //绘制节点标签
        function _drawNodeLabel(gNodes, preScale) {
            if (typeof preScale == "undefined") {
                preScale = 1
            }
            gNodes.select("text.nodelabel").remove();
            gNodes.append("svg:text").attr("class", "nodelabel").attr('text-anchor', 'middle').attr("font-size", function(d) {
                return d.labelFontSize;
            }).attr("fill", function(d) {
                return d.labelColor;
            }).attr("style", function(d) {
                return d.labelStyle;
            }).html(function(d) {
                return d.label;
            }).call(_setLabelPosition, preScale).call(_setLabelVS);
        }

        //设置标签位置
        function _setLabelPosition(label, preScale) {
            label.attr("dx", function(d) {
                return d.labelPosition ? preScale * parseInt(d.labelPosition.x) : 0;
            }).attr("dy", function(d) {
                return d.labelPosition ? preScale * parseInt(d.labelPosition.y) : 0;
            })
        }

        function _prepareData(container, enableZoom) {
            var _this = this;
            if (!container) {
                container = this.defaultContainer;
            }
            this.defaultContainer = container;
            this.preScale = 1;

            //屏蔽默认右键
            //		document.oncontextmenu = function(e){
            //  		return false;
            //		}

            //this.config包含用于图谱显示的全部信息，类似Echarts中的this.option
            this.config = {
                data: {
                    "nodes": this.nodes,
                    "links": this.links
                },
                width: $(container).innerWidth(),
                height: $(container).innerHeight(),
                distance: 50
            };

            this.__dependsNode = [],
                this.__dependsLinkAndText = [];

            //将this.config.data中边的source/target从节点id修改为直接指向节点对象，便于渲染
            _attachNodes(this.config);

            //定义图整体缩放事件
            this.zoomed = function() {
                _this.vis.attr("transform", d3.event.transform)
            }
            ;
            var zoom = d3.zoom().scaleExtent([0.05, 10]).on("zoom", function() {
                _this.zoomed()
            });

            //创建画布并绑定缩放事件
            d3.select(container).attr("id", this.id);
            this.vis0 = d3.select(container).append("svg:svg").attr("preserveAspectRatio", "xMidYMid meet").attr("viewBox", "0 0 " + this.config.width + " " + this.config.height);
            if (typeof enableZoom == "undefined" || enableZoom) {
                this.vis0.call(zoom).on("dblclick.zoom", null);
            }
            this.vis = this.vis0.append('g').attr('class', 'all').attr("width", this.config.width).attr("height", this.config.height);
        }

        //首次在指定HTML容器上显示图，参数Null时使用默认容器
        function show(container) {
            //数据预处理
            _prepareData.call(this, container);

            var _this = this;
            //点击容器空白处事件（取消高亮）
            //		d3.select(container).on('click', function() {
            //			_this.__dependsNode = _this.__dependsLinkAndText = [];
            //			_this.highlightNodeAndItsNeighbors(null)
            //		});

            //初始化力导向参数
            this.force = d3.forceSimulation().nodes(this.config.data.nodes).force("link", d3.forceLink(this.config.data.links).distance(this.config.distance)).force("center", d3.forceCenter(this.config.width / 2, this.config.height / 2)).force("charge", d3.forceManyBody().distanceMax(Math.min(this.config.width, this.config.height) * this.preScale * 2)).force("collide", d3.forceCollide(this.config.distance));

            //计算边的路径
            var linkPath = function(leftHand, d) {
                if (d.shape == DG.LINK_SHAPE_ARC || d.shape == DG.LINK_SHAPE_ARC_ARROW) {
                    var start = leftHand ? d.source : d.target
                        , end = leftHand ? d.target : d.source
                        , dx = end.x - start.x
                        , dy = end.y - start.y
                        , dr = Math.sqrt(dx * dx + dy * dy)
                        , sweep = leftHand ? 0 : 1;
                    return "M" + start.x + "," + start.y + "A" + dr + "," + dr + " 0 0," + sweep + " " + end.x + "," + end.y;
                } else {
                    return 'M ' + d.source.x + ' ' + d.source.y + ' L ' + d.target.x + ' ' + d.target.y;
                }

            };

            //定义tick事件响应（保持节点和边的连接）
            this.tick = function() {
                //			_this.__gLinks.attr("x1", function(d) {
                //				return d.source.x
                //			}).attr("y1", function(d) {
                //				return d.source.y
                //			}).attr("x2", function(d) {
                //				return d.target.x
                //			}).attr("y2", function(d) {
                //				return d.target.y
                //			});

                _this.__gLinks.attr("d", function(d) {
                    //弧线路径位置
                    return linkPath(false, d);
                });

                //
                //			_this.__gLinkLabels.attr("x", function(d) {
                //				return(d.source.x + d.target.x) / 2
                //			}).attr("y", function(d) {
                //				return(d.source.y + d.target.y) / 2
                //			});

                //关系文字显示的位置
                _this.__gLinkLabels.select("textPath").attr("d", function(d) {
                    return linkPath(d.source.x < d.target.x, d);
                });

                _this.__gNodes.attr("transform", function(d) {
                    return "translate(" + d.x + "," + d.y + ")"
                })
            }
            ;
            _this.force.on("tick", this.tick);

            //创建tooltip对象
            this.tooltip = d3.select("body").append("div").attr("class", "tooltip").attr("opacity", 0.0).on('dblclick', function() {
                d3.event.stopPropagation()
            }).on('mouseover', function() {
            }).on('mouseout', function() {
            });

            //根据this.config对图进行渲染
            this.update(container);

        }

        //高亮显示某节点及其相邻元素
        function highlightNodeAndItsNeighbors(obj) {
            var _this = this;
            if (obj) {
                var objIndex = obj.index;
                this.__dependsNode = this.__dependsNode.concat([objIndex]);
                this.__dependsLinkAndText = this.__dependsLinkAndText.concat([objIndex]);
                this.config.data.links.forEach(function(lkItem) {
                    if (objIndex == lkItem['source']['index']) {
                        _this.__dependsNode = _this.__dependsNode.concat([lkItem.target.index])
                    } else if (objIndex == lkItem['target']['index']) {
                        _this.__dependsNode = _this.__dependsNode.concat([lkItem.source.index])
                    }
                });
                _this.__gNodes.classed('inactive', function(d) {
                    return (_this.__dependsNode.indexOf(d.index) == -1)
                });
                _this.__gNodes.classed('active', function(d) {
                    return (_this.__dependsNode.indexOf(d.index) != -1)
                });
                _this.__gNodes["svg:text"];
                _this.showToolTip();
                _this.__gLinks.classed('inactive', function(d) {
                    return ((_this.__dependsLinkAndText.indexOf(d.source.index) == -1) && (_this.__dependsLinkAndText.indexOf(d.target.index) == -1))
                });
                _this.__gLinkLabels.classed('active', function(d) {
                    return ((_this.__dependsLinkAndText.indexOf(d.source.index) != -1) || (_this.__dependsLinkAndText.indexOf(d.target.index) != -1))
                })
            } else {
                _this.__gNodes.classed('inactive', false);
                _this.__gNodes.classed('active', false);
                _this.__gLinks.classed('inactive', false);
                _this.__gLinkLabels.classed('active', false);
            }
        }
        //增加节点的方法
        //add by river 20181022
        function addNodes(newNodes) {
            var _this = this;
            newNodes.forEach(function(d) {
                _this.nodes.push(d);
            })
            this.update();
        }

        //删除节点的方法--
        //add by river 20181022
        function removeNodes(nodes, flag) {
            var _graph = this;
            nodes.forEach(function(d) {
                var index = _graph.nodes.indexOf(d);
                if (index > -1) {
                    _graph.nodes.splice(index, 1);
                }
            })

            if (arguments.length == 1 || flag) {
                for (var i = _graph.links.length - 1; i >= 0; i--) {
                    //逆向循环以避免删除元素影响数组下标
                    var d = _graph.links[i];
                    var idxS = nodes.indexOf(d.source);
                    var idxT = nodes.indexOf(d.target);
                    if (idxS > -1 || idxT > -1) {
                        _graph.links.splice(i, 1);
                    }
                }
            }
            this.update();
        }

        //图差集
        function subtract(graph) {
            var s = JSON.stringify(graph);
            $.ajax({
                type: "post",
                //				url:"http://39.104.14.210:8080/Graph/filter",
                url: "http://192.168.2.221:8090/Graph/subtract",
                dataType: "json",
                data: {
                    "data": s
                },
                success: function(data) {
                    console.log(data)
                }
            });
        }
        //图交集
        function intersect(graph) {
            var s = JSON.stringify(graph);
            $.ajax({
                type: "post",
                //				url:"http://39.104.14.210:8080/Graph/filter",
                url: "http://192.168.2.221:8090/Graph/intersect",
                dataType: "json",
                data: {
                    "data": s
                },
                success: function(data) {
                    console.log(data)
                }
            });
        }
        //图合集
        function union(graph) {
            var s = JSON.stringify(graph);
            $.ajax({
                type: "post",
                url: "http://192.168.2.221:8090/Graph/union",
                dataType: "json",
                data: {
                    "data": s
                },
                success: function(data) {
                    console.log(data)
                }
            });
        }
        //对图进行过滤，并返回过滤后的图对象（原图对象不改变）
        //add by river 20181024
        function graphFilter(filter, handler) {
            var _this = this;

            if (this.nodes.length < 2) {
                if (filter.type == DG.FILTER_ENUM) {
                } else if (filter.type == DG.FILTER_RANGE) {
                }
            } else {
                var params = {
                    "userId": "index",
                    "seriaNumber": "11212",
                    "page": "123123",
                    "pageSize": "123123",
                    "graph": this.getDataJsonObj(),
                    "data": filter

                }
                //var url = "http://192.168.2.216:8082/Graph/filter";
                var url = "http://39.104.14.210:8082/Graph/filter";
                _fetchFromBackend(params, url, function(res) {
                    console.log(res);
                    //根据res构建新图
                    var resNodes = []
                        , resLinks = [];
                    res.data.nodes.forEach(function(d) {
                        var newNode = _this.getNodeById(d);
                        resNodes.push(newNode);
                    })
                    res.data.links.forEach(function(d) {
                        var newLink = _this.getLinkById(d);
                        resLinks.push(newLink);
                    })

                    var newGraph = new Graph(resNodes,resLinks);
                    handler.call(this, newGraph);
                });
            }
        }

        //查找指定节点间的所有边
        function findLinksBetweenNodes(nodes) {
            var res = this.links.filter(function(link) {
                return nodes.indexOf(link.source) != -1 && nodes.indexOf(link.target) != -1
            })
            return res;

        }
        //查找指定路径长度内，与某节点邻近的所有节点
        function findNeighborNodes(rootNode, level) {
            var result = [];
            var nodeLevels = {};
            //每个节点id与层级对应
            var linkLevels = {};
            //每条边的id与层级对应
            //		var levelFNodes = []; //每个层级的正向节点对象
            //		var levelBNodes = []; //每个层级的逆向节点对象
            //		var levelFLinks = []; //每个层级的正向边对象
            //		var levelBLinks = []; //每个层级的逆向边对象
            this.nodes.forEach(function(node) {
                //将所有节点的层级初始化为null
                nodeLevels[node.id] = null;
            })
            this.links.forEach(function(link) {
                //将所有边的层级初始化为null
                linkLevels[link.id] = null;
            })
            nodeLevels[rootNode.id] = 0;

            //		levelFNodes[0] = [rootNode];
            //		levelBNodes[0] = [rootNode];
            //		for(var i=1; i<=level; i++){//初始化每一层级的节点数组
            //			levelFNodes[i] = [];
            //			levelBNodes[i] = [];
            //			levelFLinks[i] = [];
            //			levelBLinks[i] = [];
            //		}
            for (var i = 0; i < level; i++) {
                //根据第i级找到第i+1级
                this.links.filter(function(link) {
                    //过滤出尚未连接到树上的边
                    return linkLevels[link.id] == null;
                }).forEach(function(link) {
                    if (nodeLevels[link.source.id] == i) {
                        //找出level i+1的节点和边
                        nodeLevels[link.target.id] = i + 1;
                        linkLevels[link.id] = i + 1;
                        //					levelFLinks[i+1].push(link);
                        //					if(levelFNodes[i+1].indexOf(link.target) == -1){
                        //						levelFNodes[i+1].push(link.target);
                        //					}
                    } else if (nodeLevels[link.target.id] == i) {
                        nodeLevels[link.source.id] = i + 1;
                        linkLevels[link.id] = i + 1;
                        //					levelBLinks[i+1].push(link);
                        //					if(levelBNodes[i+1].indexOf(link.source) == -1){
                        //						levelBNodes[i+1].push(link.source);
                        //					}
                    }
                })
            }

            result = this.nodes.filter(function(d) {
                return nodeLevels[d.id] != null;
            })
            return result;

        }
        //add by selena 20181023
        //查找指定长度内，两点间最短路径
        function findShortestPaths(source, target, maxLength) {

            function bfs(graph, start, end, max) {
                queue = []
                allpath = []
                queue.push([start])

                while (queue.length != 0) {
                    var path = queue.pop()
                    var node = path[path.length - 1]
                    if (node == end) {
                        allpath.push(path)

                    }

                    if (path.length >= max) {
                        continue;
                    }
                    for (var i in graph[node]) {
                        var new_path = []
                        new_path = path.concat(graph[node][i])
                        if (path.indexOf(graph[node][i]) == -1 && graph[node][i] != start) {
                            queue.push(new_path)
                        }
                    }
                }
                return allpath

            }

            var graph = {};

            for (var i = 0; i < this.nodes.length; i++) {
                var num = this.nodes[i].id
                graph[num] = []
            }
            for (var i = 0; i < this.links.length; i++) {
                if (graph[this.links[i].source.id].indexOf(this.links[i].target.id) == -1) {
                    graph[this.links[i].source.id] = graph[this.links[i].source.id].concat(this.links[i].target.id);
                }

                if (graph[this.links[i].target.id].indexOf(this.links[i].source.id) == -1) {
                    graph[this.links[i].target.id] = graph[this.links[i].target.id].concat(this.links[i].source.id);
                }

            }

            var result = bfs(graph, source.id, target.id, maxLength);

            //		this.__gNodes.classed('inactive', function(d) {
            //			for(var i in result) {
            //				if(result[i].indexOf(d.id) != -1) {
            //					return false;
            //				}
            //			}
            //			return true;
            //		});
            //
            //		this.__gNodes.classed('active', function(d) {
            //			for(var i in result) {
            //				if(result[i].indexOf(d.id) != -1) {
            //					return true;
            //				}
            //			}
            //			return false;
            //		});
            //
            //		this.__gLinks.classed('inactive', function(d) {
            //			for(var i in result) {
            //				for(var j = 0; j < result[i].length - 1; j++) {
            //					if((d.source.id == result[i][j] && d.target.id == result[i][j + 1]) ||
            //						(d.target.id == result[i][j] && d.source.id == result[i][j + 1])) {
            //						return false;
            //					}
            //				}
            //			}
            //			return true;
            //		});
            //
            //		this.__gLinkLabels.classed('active', function(d) {
            //			for(var i in result) {
            //				for(var j = 0; j < result[i].length - 1; j++) {
            //					if((d.source.id == result[i][j] && d.target.id == result[i][j + 1]) ||
            //						(d.target.id == result[i][j] && d.source.id == result[i][j + 1])) {
            //						return true;
            //					}
            //				}
            //			}
            //			return false;
            //		})

            return result;

            //	this.highlightToolTip();

            //	_this.highlightObject(allpath);

        }
        //查找指定长度内，两点间所有路径
        function findPaths(Source, targetx, maxLength) {
        }

        /*以指定节点为根，构建树图数据*/
        function buildTreeData(rootNode, level, reverse) {
            var result = {};
            var nodeLevels = {};
            //每个节点id与层级对应
            var linkLevels = {};
            //每条边的id与层级对应
            var levelFNodes = [];
            //每个层级的正向节点对象
            var levelBNodes = [];
            //每个层级的逆向节点对象
            var levelFLinks = [];
            //每个层级的正向边对象
            var levelBLinks = [];
            //每个层级的逆向边对象
            this.nodes.forEach(function(node) {
                //将所有节点的层级初始化为null
                nodeLevels[node.id] = null;
            })
            this.links.forEach(function(link) {
                //将所有边的层级初始化为null
                linkLevels[link.id] = null;
            })
            nodeLevels[rootNode.id] = 0;

            levelFNodes[0] = [rootNode];
            levelBNodes[0] = [rootNode];
            for (var i = 1; i <= level; i++) {
                //初始化每一层级的节点数组
                levelFNodes[i] = [];
                levelBNodes[i] = [];
                levelFLinks[i] = [];
                levelBLinks[i] = [];
            }
            for (var i = 0; i < level; i++) {
                //根据第i级找到第i+1级
                this.links.filter(function(link) {
                    //过滤出尚未连接到树上的边
                    return linkLevels[link.id] == null;
                }).forEach(function(link) {
                    if (nodeLevels[link.source.id] == i) {
                        //找出level i+1的节点和边
                        nodeLevels[link.target.id] = i + 1;
                        linkLevels[link.id] = i + 1;
                        levelFLinks[i + 1].push(link);
                        if (levelFNodes[i + 1].indexOf(link.target) == -1) {
                            levelFNodes[i + 1].push(link.target);
                        }
                    } else if (nodeLevels[link.target.id] == i) {
                        nodeLevels[link.source.id] = i + 1;
                        linkLevels[link.id] = i + 1;
                        levelBLinks[i + 1].push(link);
                        if (levelBNodes[i + 1].indexOf(link.source) == -1) {
                            levelBNodes[i + 1].push(link.source);
                        }
                    }
                })
            }

            var treeNodes = {};
            this.nodes.forEach(function(node) {
                if (nodeLevels[node.id] != null) {
                    //初始化所有的树节点
                    treeNodes[node.id] = {
                        id: node.id,
                        name: node.label,
                        children: []
                    };
                }
            })
            var treeNodesIds = [];
            //用于去重
            for (var i = 0; i < level; i++) {
                //依次将i+1级节点加到i级节点的children中
                levelFLinks[i + 1].forEach(function(link) {
                    if (levelFNodes[i + 1].indexOf(link.target) != -1) {
                        if (treeNodesIds.indexOf(link.target.id) == -1) {
                            //每个子节点只能成为一个父节点的children
                            treeNodes[link.source.id].children.push(treeNodes[link.target.id]);
                            treeNodesIds.push(link.target.id);
                        }
                    }
                })
                levelBLinks[i + 1].forEach(function(link) {
                    if (levelBNodes[i + 1].indexOf(link.source) != -1) {
                        if (treeNodesIds.indexOf(link.source.id) == -1) {
                            treeNodes[link.target.id].children.push(treeNodes[link.source.id]);
                            treeNodesIds.push(link.source.id);
                        }
                    }
                })
            }

            return treeNodes[rootNode.id];

        }

        //返回包含指定数据的边，fuzzy:是否模糊查找
        function getLinksByData(key, value, fuzzy) {
            if (typeof (fuzzy) == "undefined") {
                fuzzy == false
            }
            var res = this.links.filter(function(d) {
                if (fuzzy) {
                    return d.data[key].toString().indexOf(value.toString()) >= 0;
                } else {
                    return d.data[key] == value;
                }
            });
            return res;
        }
        //返回指定标签的边，fuzzy:是否模糊查找
        function getLinksByLabel(label, fuzzy) {
            if (typeof (fuzzy) == "undefined") {
                fuzzy == false
            }
            var res = this.links.filter(function(d) {
                if (fuzzy) {
                    return d.label.indexOf(label) >= 0;
                } else {
                    return d.label == label;
                }
            });
            return res;
        }
        //返回图中指定源&目标节点ID的所有边
        function getLinksByNodeIds(sourceId, targetId) {
            var res = this.links.filter(function(d) {
                return d.source.id == sourceId && d.target.id == targetId;
            });
            return res;
        }
        //返回图中指定ID的边对象，找不到则返回Null
        function getLinkById(id) {
            //		console.log(id);
            var res = this.links.filter(function(d) {
                return d.id == id;
            });
            if (res.length == 1) {
                return res[0]
            } else {
                return null;
            }
        }
        //返回包含指定数据的节点，fuzzy:是否模糊查找
        function getNodesByData(key, value, fuzzy) {
            if (typeof (fuzzy) == "undefined") {
                fuzzy == false
            }
            var res = this.nodes.filter(function(d) {
                if (fuzzy) {
                    return d.data[key].toString().indexOf(value.toString()) >= 0;
                } else {
                    return d.data[key] == value;
                }
            });
            return res;
        }

        //返回指定标签的节点(数组)，fuzzy:是否模糊查找
        function getNodesByLabel(label, fuzzy) {
            if (typeof (fuzzy) == "undefined") {
                fuzzy == false
            }
            var res = this.nodes.filter(function(d) {
                if (fuzzy) {
                    return d.label.indexOf(label) >= 0;
                } else {
                    return d.label == label;
                }
            });
            return res;
        }
        //add by selena 20181025
        //返回图中指定ID的节点对象，找不到则返回Null
        function getNodeById(id) {
            var res = this.nodes.filter(function(d) {
                return d.id == id;
            });
            if (res.length == 1) {
                return res[0]
            } else {
                return null;
            }
        }

        //add by selena 20181022
        //在图上添加边
        function addLinks(links) {
            var _this = this;
            var reDrawNodeIds = [];
            links.forEach(function(d) {
                _this.links.push(d);
                if (reDrawNodeIds.indexOf(d.source) == -1) {
                    reDrawNodeIds.push(d.source);
                }
                if (reDrawNodeIds.indexOf(d.target) == -1) {
                    reDrawNodeIds.push(d.target);
                }
            })
            var reDrawNodes = this.nodes.filter(function(d) {
                return reDrawNodeIds.indexOf(d.id) > -1;
            })

            this.update();
            this.removeNodes(reDrawNodes, false);
            this.addNodes(reDrawNodes);
        }

        //add by selena 20181022
        //在图上删除边
        function removeLinks(links) {
            var _graph = this;
            links.forEach(function(d) {
                var index = _graph.links.indexOf(d);
                if (index > -1) {
                    _graph.links.splice(index, 1);
                }
            })
            this.update();
        }

        //add by selena 20181022
        //将节点对象直接给边的source/target
        function _attachNodes(config) {
            //将节点对象直接给边的source/target
            config.data.links.forEach(function(e) {
                if (typeof e.source != "object" && typeof e.target != "object") {
                    var sourceNode = config.data.nodes.filter(function(n) {
                        return n.id == e.source
                    })[0];
                    targetNode = config.data.nodes.filter(function(n) {
                        return n.id == e.target
                    })[0];
                    e.source = sourceNode;
                    e.target = targetNode;

                }
            });
        }

        //设置点击节点响应
        function onNodeClick(handler) {
            var _this = this;
            this.__gNodes.on("click", function(d) {
                _this.event = d3.event;
                handler.call(this, d);
                d3.event.stopPropagation();
            });
        }

        //设置右击节点响应
        function onNodeRightClick(handler) {
            var _this = this;
            this.__gNodes.on("contextmenu", function(d) {
                _this.event = d3.event;
                handler.call(this, d);
                d3.event.stopPropagation();
            });
        }

        //设置点击边响应
        function onLinkClick(handler) {
            var _this = this;
            this.__gLinks.on("click", function(d) {
                _this.event = d3.event;
                handler.call(this, d);
                d3.event.stopPropagation();
            });
        }

        //设置右击边响应
        function onLinkRightClick(handler) {
            var _this = this;
            this.__gLinks.on("contextmenu", function(d) {
                _this.event = d3.event;
                handler.call(this, d);
                d3.event.stopPropagation();
            });
        }

        //设置点击空白响应
        function onBlankClick(handler) {
            var _this = this;
            d3.select(this.defaultContainer).on('click', function() {
                _this.event = d3.event;
                handler.call(_this);
                d3.event.stopPropagation();
            });
        }

        //设置右击空白响应
        function onBlankRightClick(handler) {
            var _this = this;
            d3.select(this.defaultContainer).on("contextmenu", function() {
                _this.event = d3.event;
                handler.call(_this);
                d3.event.stopPropagation();
            });
        }

        //设置拖拽节点响应
        function onNodeDrag(start, drag, end) {
            var _this = this;
            var nodeDrag = d3.drag().on("start", function(d) {
                _this.event = d3.event;
                _this.force.stop();
                start.call(_this, d);
                d3.event.sourceEvent.stopPropagation();
            }).on("drag", function(d) {
                _this.event = d3.event;
                d.px += d3.event.dx;
                d.py += d3.event.dy;
                d.x += d3.event.dx;
                d.y += d3.event.dy;
                _this.tick();
                drag.call(_this, d);
            }).on("end", function(d) {
                _this.event = d3.event;
                d3.event.subject.fx = null;
                d3.event.subject.fy = null;
                _this.force.restart();
                _this.tick();
                end.call(_this, d);
            });
            this.__gNodes.call(nodeDrag);

        }

        //随机产生UUID
        function _guid() {
            function S4() {
                return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
            }
            return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
        }

        //访问后台服务
        function _fetchFromBackend2(params, url, handle) {
            let formdata = new FormData();
            formdata.append("data", params);
            fetch(url, {
                method: "POST",
                mode: 'no-cors',
                credentials: 'include',
                headers: {
                    'Access-Control-Allow-Origin': '*',
                    "Content-Type": "application/json"
                },
                body: formdata
            }).then(function(response) {
                console.log(response.ok);
                handle.call(this, response);
            })
        }

        function _fetchFromBackend(params, url, handle, async) {
            var s = JSON.stringify(params);
            //		console.log(s);
            if (typeof async == "undefined") {
                async = true
            }
            $.ajax({
                type: "post",
                url: url,
                //dataType: "json",
                data: {
                    "data": s
                },
                async: async,
                //处理接收到的数据，渲染图形
                success: function(data) {
                    handle.call(this, data);
                }
            });
        }

        function getDataJsonObj() {
            var nodes = [];
            var links = [];
            this.nodes.forEach(function(d) {
                nodes.push({
                    id: d.id,
                    data: d.data
                })
            });
            this.links.forEach(function(d) {
                links.push({
                    id: d.id,
                    source: d.source.id,
                    target: d.target.id,
                    data: d.data
                })
            });
            return {
                id: this.id,
                nodes: nodes,
                links: links
            }
        }

        //保存成Png
        function downloadPng(callback) {
            svgAsPngUri(this.vis0.node(), null, function(uri) {
                if (typeof callback == "function") {
                    callback.call(this, uri);
                } else {
                    var pngName = "svgtoPng";
                    var a = document.createElement("a");
                    a.download = pngName + ".png";
                    a.href = uri;
                    a.click();
                }
            });
        }

        //保存svg
        function downloadSvg() {
            var svgHeadInfo = '<?xml version="1.0" encoding="UTF-8"?>\n<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"\n"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">';
            //var svg = $('#vizContainer').find('svg')[0];
            //svg.setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink");

            var svgSource = this.vis0.node().parentNode.innerHTML;

            d3.select("body").append("a").attr("title", "file.svg").attr("href-lang", "image/svg+xml").attr("href", "data:image/svg+xml;base64," + btoa(unescape(encodeURIComponent(svgHeadInfo + svgSource)))).text("Download");

        }
        //随机生成新图
        function randomGraph(nodesNum, linksNum) {
            var Ids = [];
            var nodes = [];
            var links = [];
            var numColor = parseInt(nodesNum / 10) > 1 ? parseInt(nodesNum / 10) : 1;
            var colors = DG.randomColorRange(numColor);
            for (var i = 0; i < nodesNum; i++) {
                //循环创建节点
                var myNode = new DG.Node(DG.guid(),DG.guid().substr(0, 4));
                var shape = [DG.NODE_SHAPE_STAR, DG.NODE_SHAPE_RECT, DG.NODE_SHAPE_CIRCLER];
                myNode.fillColor = colors[randomFn(0, numColor - 1)];
                myNode.symbolType = DG.NODE_GEOMETRY;
                myNode.shape = shape[randomFn(0, shape.length - 1)];
                var r = randomFn(20, 40) + "px";
                myNode.size = {
                    width: r,
                    height: r
                };
                //			console.log(myNode)	;
                nodes.push(myNode);
                Ids.push(myNode.id);
            }

            for (var i = 0; i < linksNum; i++) {
                //创建边
                //在已经生成的节点id里随机提取节点作为源和目标
                var myNodeId1 = Ids[randomFn(0, Ids.length - 1)];
                var myNodeId2 = Ids[randomFn(0, Ids.length - 1)];
                //相同的source和target可以是不同的边
                if (myNodeId1 != myNodeId2) {
                    var myLink = new DG.Link(DG.guid(),myNodeId1,myNodeId2,DG.guid().substr(0, 4));
                    var shape = [DG.LINK_SHAPE_STRIP, DG.LINK_SHAPE_ARC];
                    myLink.color = colors[randomFn(0, numColor - 1)];
                    myLink.width = 2;
                    myLink.shape = shape[randomFn(0, shape.length - 1)];
                    links.push(myLink);
                }
            }
            var myGraph = new DG.Graph(nodes,links);
            myGraph.show('div.container');
            /***************生成随机数**************/
            function randomFn(minNum, maxNum) {
                return parseInt(Math.random() * (maxNum + 1 - minNum) + minNum);
            }
        }

        function randomColorRange(length) {

            //从数组中取随机不重复序列
            function roa(arr, count) {
                var temp = new Array();

                for (i = 0; i < count; i++) {
                    var num = Math.floor(Math.random() * arr.length);
                    temp.push(arr[num]);
                    arr.splice(num, 1);
                }
                return temp;
            }

            var res = [];
            //色谱数量为所需颜色数量的2倍,兼顾随机性并最大化区分度
            hRange = d3.range(length * 2).map(function(d) {
                return d * 180 / length;
            });
            var randomH = roa(hRange, length);
            for (var i = 0; i < length; i++) {
                res[i] = "hsl(" + randomH[i] + ", 50%, 50%)";
            }
            return res;
        }

        /*暴露方法列表*/
        Node.prototype.show = nodeShow;
        Node.prototype.hide = nodeHide;
        Node.prototype.setVisualStatus = nodeSetVisualStatus;
        Node.prototype.getPosition = getPosition;
        Node.prototype.setSymbolType = nodeSetSymbolType;
        Node.prototype.setShape = nodeSetShape;
        Node.prototype.setImage = nodeSetImage;
        Node.prototype.setFillColor = nodeSetFillColor;
        Node.prototype.setSize = nodeSetSize;
        Node.prototype.setStyle = nodeSetStyle;
        Node.prototype.setLabel = nodeSetLabel;
        Node.prototype.setLabelData = nodeSetLabelData;
        Node.prototype.showLabel = nodeShowLabel;
        Node.prototype.hideLabel = nodeHideLabel;
        Node.prototype.setLabelColor = nodeSetLabelColor;
        Node.prototype.setLabelFontSize = nodeSetLabelFontSize;
        Node.prototype.setLabelPosition = nodeSetLabelPosition;
        Node.prototype.setLabelStyle = nodeSetLabelStyle;
        Node.prototype.addEventListener = nodeAddEventListener;
        Node.prototype.removeEventListener = nodeRemoveEventListener;

        Link.prototype.show = linkShow;
        Link.prototype.hide = linkHide;
        Link.prototype.setVisualStatus = linkSetVisualStatus;
        Link.prototype.setShape = linkSetShape;
        Link.prototype.setColor = linkSetColor;
        Link.prototype.setWidth = linkSetWidth;
        Link.prototype.setLabel = linkSetLabel;
        Link.prototype.setLabelColor = linkSetLabelColor;
        Link.prototype.setLabelFontSize = linkSetLabelFontSize;
        Link.prototype.setLineType = linkSetLineType;
        Link.prototype.setLabelData = linkSetLabelData;
        Link.prototype.showLabel = linkShowLabel;
        Link.prototype.hideLabel = linkHideLabel;
        //Link.prototype.setLabelPosition = linkSetLabelPosition;
        Link.prototype.setLabelStyle = linkSetLabelStyle;
        Link.prototype.addEventListener = linkAddEventListener;
        Link.prototype.removeEventListener = linkRemoveEventListener;
        //add by selena 20181022

        Graph.prototype.hideLinks = hideLinks;
        Graph.prototype.showLinks = showLinks;
        Graph.prototype.hideNodeLabels = hideNodeLabels;
        Graph.prototype.showNodeLabels = showNodeLabels;
        Graph.prototype.setNodeLabelData = graphSetNodeLabelData;
        Graph.prototype.hideLinkLabels = hideLinkLabels;
        Graph.prototype.showLinkLabels = showLinkLabels;
        Graph.prototype.setLinksShape = setLinksShape;
        Graph.prototype.showLinkArrows = showLinkArrows;
        Graph.prototype.hideLinkArrows = hideLinkArrows;
        Graph.prototype.hideNodes = hideNodes;
        Graph.prototype.showNodes = showNodes;
        Graph.prototype.showAll = showAll;
        Graph.prototype.hide = graphHide;
        Graph.prototype.update = update;
        Graph.prototype.show = show;
        Graph.prototype.subtract = subtract;
        Graph.prototype.intersect = intersect;
        Graph.prototype.union = union;
        Graph.prototype.filter = graphFilter;
        Graph.prototype.findLinksBetweenNodes = findLinksBetweenNodes;
        Graph.prototype.findNeighborNodes = findNeighborNodes;
        Graph.prototype.findShortestPaths = findShortestPaths;
        Graph.prototype.buildTreeData = buildTreeData
        Graph.prototype.findPaths = findPaths;
        Graph.prototype.getLinksByData = getLinksByData;
        Graph.prototype.getLinksByLabel = getLinksByLabel;
        Graph.prototype.getLinksByNodeIds = getLinksByNodeIds;
        Graph.prototype.getLinkById = getLinkById;
        Graph.prototype.getNodesByData = getNodesByData;
        Graph.prototype.getNodesByLabel = getNodesByLabel;
        Graph.prototype.getNodeById = getNodeById;
        Graph.prototype.addLinks = addLinks;
        Graph.prototype.removeLinks = removeLinks;
        Graph.prototype.addNodes = addNodes;
        Graph.prototype.removeNodes = removeNodes;
        Graph.prototype.highlightNodeAndItsNeighbors = highlightNodeAndItsNeighbors;
        //	Graph.prototype.showToolTip =showToolTip;
        Graph.prototype.onNodeClick = onNodeClick;
        Graph.prototype.onNodeRightClick = onNodeRightClick;
        Graph.prototype.onLinkClick = onLinkClick;
        Graph.prototype.onLinkRightClick = onLinkRightClick;
        Graph.prototype.onBlankClick = onBlankClick;
        Graph.prototype.onBlankRightClick = onBlankRightClick;
        Graph.prototype.onNodeDrag = onNodeDrag;
        Graph.prototype.moveNodesTo = moveNodesTo;
        Graph.prototype.addVisualMap = addVisualMap;
        Graph.prototype.stat = stat;
        Graph.prototype.layout = graphLayout;
        Graph.prototype.getDataJsonObj = getDataJsonObj;
        Graph.prototype.downloadPng = downloadPng;
        Graph.prototype.downloadSvg = downloadSvg;

        //需公开构造函数的类型，在这里将构造函数添加到DG
        DG.Node = Node;
        DG.Graph = Graph;
        DG.Path = Path;
        DG.Link = Link;

        DG.guid = _guid;
        DG.createGraphFromJson = createGraphFromJson;
        DG.createGraphFromWosText = createGraphFromWosText;

        DG.testService = _fetchFromBackend;
        DG.randomGraph = randomGraph;
        DG.randomColorRange = randomColorRange

        Object.freeze(DG);

    }
)();

// 2010-03-12 v1.0.0
//十六进制颜色值域RGB格式颜色值之间的相互转换

//-------------------------------------

/*RGB颜色转换为16进制*/
String.prototype.colorHex = function() {
    //十六进制颜色值的正则表达式
    var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
    var that = this;
    if (/^(rgb|RGB)/.test(that)) {
        var aColor = that.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(",");
        var strHex = "#";
        for (var i = 0; i < aColor.length; i++) {
            var hex = Number(aColor[i]).toString(16);
            if (hex === "0") {
                hex += hex;
            }
            strHex += hex;
        }
        if (strHex.length !== 7) {
            strHex = that;
        }
        return strHex;
    } else if (reg.test(that)) {
        var aNum = that.replace(/#/, "").split("");
        if (aNum.length === 6) {
            return that;
        } else if (aNum.length === 3) {
            var numHex = "#";
            for (var i = 0; i < aNum.length; i += 1) {
                numHex += (aNum[i] + aNum[i]);
            }
            return numHex;
        }
    } else {
        return that;
    }
}
;

//-------------------------------------------------

/*16进制颜色转为RGB格式*/
String.prototype.colorRgb = function() {
    //十六进制颜色值的正则表达式
    var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
    var sColor = this.toLowerCase();
    if (sColor && reg.test(sColor)) {
        if (sColor.length === 4) {
            var sColorNew = "#";
            for (var i = 1; i < 4; i += 1) {
                sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1));
            }
            sColor = sColorNew;
        }
        //处理六位的颜色值
        var sColorChange = [];
        for (var i = 1; i < 7; i += 2) {
            sColorChange.push(parseInt("0x" + sColor.slice(i, i + 2)));
        }
        return "RGB(" + sColorChange.join(",") + ")";
    } else {
        return sColor;
    }
}
;

/*取颜色字符串的RGB值*/
String.prototype.rgbValues = function() {

    //十六进制颜色值的正则表达式
    var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
    var that = this;
    if (/^(rgb|RGB)/.test(that)) {
        var aColor = that.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(",");
        for (var i = 0; i < aColor.length; i++) {
            aColor[i] = parseInt(aColor[i]);
        }
        return aColor;
    } else if (reg.test(that)) {
        var aNum = that.replace(/#/, "").split("");
        if (aNum.length === 6) {
            var aNumNew = [];
            for (var i = 0; i < 6; i += 2) {
                aNumNew.push(parseInt("0x" + aNum[i] + aNum[i + 1]));
            }
            return aNumNew;
        } else if (aNum.length === 3) {
            for (var i = 0; i < aNum.length; i += 1) {
                aNum[i] = parseInt("0x" + aNum[i] + aNum[i]);
            }
            return aNum;
        }
    } else {
        //颜色名称
        var colours = {
            "aliceblue": "#f0f8ff",
            "antiquewhite": "#faebd7",
            "aqua": "#00ffff",
            "aquamarine": "#7fffd4",
            "azure": "#f0ffff",
            "beige": "#f5f5dc",
            "bisque": "#ffe4c4",
            "black": "#000000",
            "blanchedalmond": "#ffebcd",
            "blue": "#0000ff",
            "blueviolet": "#8a2be2",
            "brown": "#a52a2a",
            "burlywood": "#deb887",
            "cadetblue": "#5f9ea0",
            "chartreuse": "#7fff00",
            "chocolate": "#d2691e",
            "coral": "#ff7f50",
            "cornflowerblue": "#6495ed",
            "cornsilk": "#fff8dc",
            "crimson": "#dc143c",
            "cyan": "#00ffff",
            "darkblue": "#00008b",
            "darkcyan": "#008b8b",
            "darkgoldenrod": "#b8860b",
            "darkgray": "#a9a9a9",
            "darkgreen": "#006400",
            "darkkhaki": "#bdb76b",
            "darkmagenta": "#8b008b",
            "darkolivegreen": "#556b2f",
            "darkorange": "#ff8c00",
            "darkorchid": "#9932cc",
            "darkred": "#8b0000",
            "darksalmon": "#e9967a",
            "darkseagreen": "#8fbc8f",
            "darkslateblue": "#483d8b",
            "darkslategray": "#2f4f4f",
            "darkturquoise": "#00ced1",
            "darkviolet": "#9400d3",
            "deeppink": "#ff1493",
            "deepskyblue": "#00bfff",
            "dimgray": "#696969",
            "dodgerblue": "#1e90ff",
            "firebrick": "#b22222",
            "floralwhite": "#fffaf0",
            "forestgreen": "#228b22",
            "fuchsia": "#ff00ff",
            "gainsboro": "#dcdcdc",
            "ghostwhite": "#f8f8ff",
            "gold": "#ffd700",
            "goldenrod": "#daa520",
            "gray": "#808080",
            "green": "#008000",
            "greenyellow": "#adff2f",
            "honeydew": "#f0fff0",
            "hotpink": "#ff69b4",
            "indianred ": "#cd5c5c",
            "indigo": "#4b0082",
            "ivory": "#fffff0",
            "khaki": "#f0e68c",
            "lavender": "#e6e6fa",
            "lavenderblush": "#fff0f5",
            "lawngreen": "#7cfc00",
            "lemonchiffon": "#fffacd",
            "lightblue": "#add8e6",
            "lightcoral": "#f08080",
            "lightcyan": "#e0ffff",
            "lightgoldenrodyellow": "#fafad2",
            "lightgrey": "#d3d3d3",
            "lightgreen": "#90ee90",
            "lightpink": "#ffb6c1",
            "lightsalmon": "#ffa07a",
            "lightseagreen": "#20b2aa",
            "lightskyblue": "#87cefa",
            "lightslategray": "#778899",
            "lightsteelblue": "#b0c4de",
            "lightyellow": "#ffffe0",
            "lime": "#00ff00",
            "limegreen": "#32cd32",
            "linen": "#faf0e6",
            "magenta": "#ff00ff",
            "maroon": "#800000",
            "mediumaquamarine": "#66cdaa",
            "mediumblue": "#0000cd",
            "mediumorchid": "#ba55d3",
            "mediumpurple": "#9370d8",
            "mediumseagreen": "#3cb371",
            "mediumslateblue": "#7b68ee",
            "mediumspringgreen": "#00fa9a",
            "mediumturquoise": "#48d1cc",
            "mediumvioletred": "#c71585",
            "midnightblue": "#191970",
            "mintcream": "#f5fffa",
            "mistyrose": "#ffe4e1",
            "moccasin": "#ffe4b5",
            "navajowhite": "#ffdead",
            "navy": "#000080",
            "oldlace": "#fdf5e6",
            "olive": "#808000",
            "olivedrab": "#6b8e23",
            "orange": "#ffa500",
            "orangered": "#ff4500",
            "orchid": "#da70d6",
            "palegoldenrod": "#eee8aa",
            "palegreen": "#98fb98",
            "paleturquoise": "#afeeee",
            "palevioletred": "#d87093",
            "papayawhip": "#ffefd5",
            "peachpuff": "#ffdab9",
            "peru": "#cd853f",
            "pink": "#ffc0cb",
            "plum": "#dda0dd",
            "powderblue": "#b0e0e6",
            "purple": "#800080",
            "rebeccapurple": "#663399",
            "red": "#ff0000",
            "rosybrown": "#bc8f8f",
            "royalblue": "#4169e1",
            "saddlebrown": "#8b4513",
            "salmon": "#fa8072",
            "sandybrown": "#f4a460",
            "seagreen": "#2e8b57",
            "seashell": "#fff5ee",
            "sienna": "#a0522d",
            "silver": "#c0c0c0",
            "skyblue": "#87ceeb",
            "slateblue": "#6a5acd",
            "slategray": "#708090",
            "snow": "#fffafa",
            "springgreen": "#00ff7f",
            "steelblue": "#4682b4",
            "tan": "#d2b48c",
            "teal": "#008080",
            "thistle": "#d8bfd8",
            "tomato": "#ff6347",
            "turquoise": "#40e0d0",
            "violet": "#ee82ee",
            "wheat": "#f5deb3",
            "white": "#ffffff",
            "whitesmoke": "#f5f5f5",
            "yellow": "#ffff00",
            "yellowgreen": "#9acd32"
        };

        if (typeof colours[that.toLowerCase()] != 'undefined') {
            var aNum = colours[that.toLowerCase()].replace(/#/, "").split("");
            var aNumNew = [];
            for (var i = 0; i < 6; i += 2) {
                aNumNew.push(parseInt("0x" + aNum[i] + aNum[i + 1]));
            }
            return aNumNew;
        }
        return false;
    }
}
